Git Product home page Git Product logo

arcwelderlib's People

Contributors

fleutot avatar formerlurker avatar oliof avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

arcwelderlib's Issues

ArcWelderStraightener seems to assume absolute extruder values

Hi!
Using current version (master, efb6c54), I tested to convert a small gcode-file into using arcs, and then back again to replace the arcs by lines. The original gcode uses relative extrusion distances, and the arc-version seems to be correct. However, in the "straightened" gcode, all G1 commands corresponding to former arcs have progressively increasing E-values.

Seems like the ArcWelderStraightener has not picked up that the E-values are relative. The gcode I tested is from PrusaSlicer and uses M83 to switch to relative E-values.

Build artifacts for OSX crash with a segfault

The build artefacts for OSX are not working. This seems to be caused by the buildprocess, because if I create a build on my local system the executable works fine.

Here's the output from lldb trying to run the ArcWelder command on a simple gcode file:

Aldos-Mac:Desktop aldo$ lldb macOS/bin/ArcWelder test.gcode 
(lldb) target create "macOS/bin/ArcWelder"
Current executable set to 'macOS/bin/ArcWelder' (x86_64).
(lldb) settings set -- target.run-args  "test.gcode"
(lldb) run
Process 639 launched: '/Users/aldo/Desktop/macOS/bin/ArcWelder' (x86_64)
2021-01-18 11:17:03.002 - arc_welder.gcode_conversion - INFO - Source and target path are the same.  The source file will be overwritten.  Temporary file path: 719a288e-3d85-c237-7184-f1d585b68792.tmp
2021-01-18 11:17:03.002 - arc_welder.gcode_conversion - INFO - Processing Gcode
	Source File Path             : test.gcode
	Target File Path (overwrite) : 719a288e-3d85-c237-7184-f1d585b68792.tmp
	Temporary File Path          : 719a288e-3d85-c237-7184-f1d585b68792.tmp
	Resolution                   : 0.0500mm (+-0.02500mm)
	Path Tolerance               : 5.000%
	Maximum Arc Radius           : 1000000mm
	Min Arc Segments             : 0
	MM Per Arc Segment           : 1000000.000
	Allow 3D Arcs                : False
	Allow Dynamic Precision      : False
	Default XYZ Precision        : 3
	Default E Precision          : 5
	G90/G91 Influences Extruder  : False
	Log Level                    : INFO
	Hide Progress Updates        : False
Process 639 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x000000010001c054 ArcWelder`___lldb_unnamed_symbol211$$ArcWelder + 2132
ArcWelder`___lldb_unnamed_symbol211$$ArcWelder:
->  0x10001c054 <+2132>: movq   %rdi, -0x68(%rax)
    0x10001c058 <+2136>: movq   (%rcx,%rbx,8), %rdi
    0x10001c05c <+2140>: movq   %rdi, -0x60(%rax)
    0x10001c060 <+2144>: movq   0x8(%rdx,%rbx,8), %rdi
Target 0: (ArcWelder) stopped.
(lldb) 

Unfortunately, the build artifacts are not debug builds, so it is hard to see what exactly is going wrong.

How to use with PrusaSlicer on Mac

Dear all,
could somebody please help me how to use the script on MacOS version of PrusaSlicer? Meaning, where to save the ArcWelder file and how exactly to insert the path..

Thanks a lot!

Cura Script

You should include a folder here that allows users to easily import your script into their favorite slicer. The console app by itself needs a wrapper essentially to interface with cura for example. Here is something I wrote and which is working for me. I don't know to how to parallelize it however, so that is something someone with better python knowledge can do.
ArcWelder.zip

Pre-calculate tolerance values

Some inner loops are calculating tolerance values from precision values. This takes too long. Pre-calculate this when precision is updated.

Lot of artifacts

I tried post-processing on a circular part:
render_image_original

but the result is very "noisy"
render_image_welded

Original g-Code is attached
CabochonEchelle.zip

Command line is the simplest one :
ArcWelderConsole.exe CabochonEchelle.gcode CabochonEchelle-weld.gcode

Using Simplify3D 4.1.2 to slice, Repetier Server 0.93.1 to render.

ArcWelder increases amount of movements

As per attached screenshot, AW (command line version for Win64) increases the amount of movements for certain arc groups instead of decreasing them.
Leaving alone the question how this can happen (maybe too many actually straight movements are recognized as an arc?), it is probably better to by default not weld arcs where it would actually increase amount of commands.

I am also attaching the gcode file (before and after conversion) as well as the log, all with added ".txt" (otherwise cannot upload for some reason).
aw_output

after_conversion.gcode
arcwelder.log
source.gcode

Marlin Bugfix Introduces new logic for arcs

Not an urgent fix, but thought I'd just give you a heads up that Marlin firmware bugfix branch had implemented new arc logic sometime last year.

This is the part of your code that differs from that version:

float angular_travel_total = atan2(r_axis_x * rt_y - r_axis_y * rt_x, r_axis_x * rt_x + r_axis_y * rt_y);
if (angular_travel_total < 0) { angular_travel_total += (float)(2 * M_PI); }
bool check_mm_per_arc_segment_max = false;
if (cs_.min_arc_segments > 0)
{
// 20200417 - FormerLurker - Implement MIN_ARC_SEGMENTS if it is defined - from Marlin 2.0 implementation
// Do this before converting the angular travel for clockwise rotation
mm_per_arc_segment = (float)(radius * ((2.0f * M_PI) / cs_.min_arc_segments));
check_mm_per_arc_segment_max = true;
}
if (cs_.arc_segments_per_sec > 0)
{
// 20200417 - FormerLurker - Implement MIN_ARC_SEGMENTS if it is defined - from Marlin 2.0 implementation
float mm_per_arc_segment_sec = (float)((feed_rate / 60.0f) * (1.0f / cs_.arc_segments_per_sec));
if (mm_per_arc_segment_sec < mm_per_arc_segment)
mm_per_arc_segment = mm_per_arc_segment_sec;
check_mm_per_arc_segment_max = true;
}
if (cs_.min_mm_per_arc_segment > 0)
{
check_mm_per_arc_segment_max = true;
// 20200417 - FormerLurker - Implement MIN_MM_PER_ARC_SEGMENT if it is defined
// This prevents a very high number of segments from being generated for curves of a short radius
if (mm_per_arc_segment < cs_.min_mm_per_arc_segment) mm_per_arc_segment = cs_.min_mm_per_arc_segment;
}
if (check_mm_per_arc_segment_max && mm_per_arc_segment > cs_.mm_per_arc_segment) mm_per_arc_segment = cs_.mm_per_arc_segment;
// Adjust the angular travel if the direction is clockwise
if (isclockwise) { angular_travel_total -= (float)(2 * M_PI); }
//20141002:full circle for G03 did not work, e.g. G03 X80 Y80 I20 J0 F2000 is giving an Angle of zero so head is not moving
//to compensate when start pos = target pos && angle is zero -> angle = 2Pi
if (p_x == t_x && p_y == t_y && angular_travel_total == 0)
{
angular_travel_total += (float)(2 * M_PI);
}
//end fix G03
// 20200417 - FormerLurker - rename millimeters_of_travel to millimeters_of_travel_arc to better describe what we are
// calculating here
float millimeters_of_travel_arc = hypot(angular_travel_total * radius, std::fabs(travel_z));
if (millimeters_of_travel_arc < 0.001) { return; }
// Calculate the total travel per segment
// Calculate the number of arc segments
uint16_t segments = static_cast<uint16_t>(ceil(millimeters_of_travel_arc / mm_per_arc_segment));
// Calculate theta per segments and linear (z) travel per segment
float theta_per_segment = angular_travel_total / segments;
float linear_per_segment = travel_z / (segments);
// Calculate the extrusion amount per segment
float segment_extruder_travel = extruder_travel_total / (segments);

The equivalent section in marlin branch is lines 79-110 from the G2_G3.cpp file within gcode/motion:
https://github.com/MarlinFirmware/Marlin/blob/e7c711996bd3080f5e343eff5556736cbf2e2416/Marlin/src/gcode/motion/G2_G3.cpp#L79-L110

Basically, they fixed a bug involving precision issues when doing full arcs and also fixed another issue whereby G2 could have more or less segments than an equivalent G3 if over 180 degrees.

Feedback for V1.1.0

Please let me know if you've used the new build of ArcWelder or any of the associated libraries. I would love to know what you like, what you don't, what you love, and what you hate. If you have discovered any bugs, please mention those here. I may ask you to create a separate issue for any newly discovered bugs.

Thank you all so much! Without you all I couldn't have done this, and I'm feeling really good about the core algorithm now.

Distance check should be per segment, not for an entire arc.

So, I've been copying some of the core logic for this project as a DXF welder for laser cutting/CNC machining from OpenSCAD.

One of the tweaks I've identified that is highly effective in maintaining accuracy, but making longer, sharper-angled arcs is to not track expected length for an entire arc-in-progress, but to calculate the nominal arc length for the angular distance between the last point on an arc and the next proposed point.

Diagram:
aww-board

Right now we compare (abs((d1 + d2) - (d3 + d4)) < resolution) where resolution is something like 0.005.

I found from my testing this results in a lot of arcs not being formed. Removing this logic led to weird point inclusions due to distance, but coincidentally being in an "arc". I found a modified logic, using the same diagram as above: abs(d1 - d3) < resolution && abs(d3 - d4) < resolution. This maintains accuracy, but allows large or sharp arcs to properly form. To calculate d3 or d4, and presently they are calculated for the entire arc, I just modified some logic to get the angular difference from the two points of the corresponding segment.

See analogous removed logic: https://github.com/Protryon/dxf-welder/blob/main/src/dxf_process.rs#L160
Added logic: https://github.com/Protryon/dxf-welder/blob/main/src/dxf_process.rs#L221

Prusaslicer Viewer 2.x doesnt recognize files processed by ArcWelder

This is more of an fyi or very minor issue, but the PrusaSlicer 2.x viewer expects a line that looks something like this at the top of the file:

; generated by PrusaSlicer 2.3.0+win64 on 2021-02-21 at 22:41:55 UTC

ArcWelder puts its own info (for example) at the top:

; Postprocessed by ArcWelder
; Copyright(C) 2020 - Brad Hochgesang
; resolution=0.05mm
; path_tolerance=5%
; max_radius=1000000.00mm
; default_xyz_precision=3
; default_e_precision=5

Even though they are just comments, this results in the viewer producing a popup error message stating:

"Internal error: Not a PrusaSlicer / Slic3r PE generated g-code"

It is a simple cut and paste fix for users, of course, but thought you should know.

Maybe the comments could be appended to the gcode file instead of prepending?

Very cool tool btw.

Enahnce arc direction detection

Arc direction detection has been a bit hairy in previous versions. It rarely failed, but the method of verification caused some smaller segments not to be converted. The routine relied on a constant, which limited accuracy.

Alter detection routine so that it can detect more arcs without generating one that has the wrong rotation.

Add a direction test that allows the arc to be repaired if the direction is wrong.

Malformed model after welding

Hi,
I've encountered an issue, with the master branch of ArcWelderLib.
I did not see the problem with the Octroprint plugin (up to date with stable version I think).

Before welding (spacer.gcode):
spacer_gcode

After welding (spacer.aw.gcode):
spacer_aw_gcode

Relevant files are here: spacer.zip

$ build/ArcWelderConsole/ArcWelder ~/Desktop/spacer.gcode ~/Desktop/spacer.aw.gcode
2021-02-04 11:54:42.001 - arc_welder.gcode_conversion - INFO - Processing Gcode
	Source File Path             : /home/gkatev/Desktop/spacer.gcode
	Target File File             : /home/gkatev/Desktop/spacer.aw.gcode
	Resolution                   : 0.0500mm (+-0.02500mm)
	Path Tolerance               : 5.000%
	Maximum Arc Radius           : 1000000mm
	Min Arc Segments             : 0
	MM Per Arc Segment           : 0.000
	Allow 3D Arcs                : False
	Allow Dynamic Precision      : False
	Default XYZ Precision        : 3
	Default E Precision          : 5
	G90/G91 Influences Extruder  : False
	Log Level                    : INFO
	Hide Progress Updates        : False
2021-02-04 11:54:42.003 - arc_welder.gcode_conversion - INFO - arc_welder::process - Parameters received: source_file_path: '/home/gkatev/Desktop/spacer.gcode', target_file_path:'/home/gkatev/Desktop/spacer.aw.gcode', resolution_mm:0.05mm (+-0.03mm), path_tolerance_percent: 0.05, max_radius_mm:1000000.00, min_arc_segments:0, mm_per_arc_segment:0, g90_91_influences_extruder: False, allow_3d_arcs: False, allow_dynamic_precision: False, default_xyz_precision: 3, default_e_precision: 5
Progress:  percent_complete:0.00, seconds_elapsed:0.00, seconds_remaining:inf, gcodes_processed: 0, current_file_line: 0, points_compressed: 0, arcs_created: 0, num_firmware_compensations: 0, compression_ratio: 0.00, size_reduction: 0.00% 
Progress:  percent_complete:100.00, seconds_elapsed:0.04, seconds_remaining:0.00, gcodes_processed: 14292, current_file_line: 17723, points_compressed: 6513, arcs_created: 301, num_firmware_compensations: 0, compression_ratio: 1.43, size_reduction: 30.14% 
2021-02-04 11:54:42.044 - arc_welder.gcode_conversion - INFO - 
   Min          Max     Source  Target  Change
----------------------------------------------
  0.000mm to   0.002mm       0       0    0.0%
  0.002mm to   0.005mm       0       0    0.0%
  0.005mm to   0.010mm       0       0    0.0%
  0.010mm to   0.050mm       0       0    0.0%
  0.050mm to   0.100mm       0       0    0.0%
  0.100mm to   0.500mm    3321    1317  -60.3%
  0.500mm to   1.000mm    5430    2678  -50.7%
  1.000mm to   5.000mm    4539    4613    1.6%
  5.000mm to  10.000mm       4      77 1825.0%
 10.000mm to  20.000mm       0     147     INF
 20.000mm to  50.000mm       0       2     INF
 50.000mm to 100.000mm       0       0    0.0%
          >= 100.000mm       0       0    0.0%
----------------------------------------------
Total distance source:.............10493.418mm
Total distance target:.............11209.758mm
   Total count source:...................13294
   Total count target:....................8834
 Total percent change:..................-33.5%
2021-02-04 11:54:42.044 - arc_welder.gcode_conversion - INFO - Arc Welder process completed successfully.

Need build instructions

Unless it's somewhere I forgot to look I couldn't find any build instructions for the source code. I took a stab and I believe this worked: (I downloaded the source (tar.gz) and from within the extracted directory)

mkdir build
cd build
cmake --DCMAKE_INSTALL_PREFIX=/opt/ArcWelder ..
make
make install

Did I miss anything?

Add best fit curve algorithm

Further improve the curve fitting by reducing the maximum deviation in steps. Allow this to be enabled/disabled, and provide an argument for determining the number of steps.

Less arcs welded than expected on simple piece

Hi,
I use the arc welder plugin in Cura and well I did a simple round piece, it's a single wall 100mm diameter ring.
I basically wanted to see if this improved the finish on arcs with Marlin 2.0 and my printer.
The piece is basically a circle so I expected almost everything to be replaced by curves but it's not the case. I suppose this come from the pieces STL export or from my settings. Can you help me configuring this ?
circle.zip
CFFFP_circle.gcode.txt
CFFFP_circle_arc.gcode.txt

CPU load too hight during printing

When arc welding during printing, the print process comes to a stop or starts stutter.

I did no "top" during arc welding, beause ssh does not work on my raspberry anymore, but maybe a "nice" value for the welding process prio would mitigate the problem?

Cheers,
Alex

Add precision parameters

Add parameters to control allow_dynamic_precision, default_xyz_precision, and default_e_precision to handle issues with bad gcode output producing obscene precision. This was not a problem with the arc welder library, per se, but the resulting gcode could overflow some firmware buffers depending on the precision.

Defaults:
allow_dynamic_precision - false
default_xyz_precision - 3
default_e_precision - 5

The defaults should be fine for 99 percent of use cases.

ArcWelder slows down a lot on certain parts.

For my Snapmaker 2.0 I'm using Cura. I made a tiny cylinder but whenever it is printing the gyroid type infills, part of of it is printed at a crawling speed.
Here is the video:
https://user-images.githubusercontent.com/79637793/109184664-85938b80-778f-11eb-8abd-f8253616c4a2.mp4
While writing this down, I just realized that the only difference between the infill and the rest of the cylinder is that it contains G2 commands. Perhaps there is a firmware issue related to G2.
I'll try to check on that and report later on what I find.

I tried version 1.1.0 and version 1.1.1 both with the same result.
I've included the gcode files here (don't know how to send them otherwise yet), but had to rename them to .txt files in order to do so.
no-arc-welder.gcode.txt
arc-welder-1.1.0.gcode.txt
arc-welder-1.1.1.gcode.txt

Enahnce double to string performance

About 20-25 percent of the processor's time goes to turning doubles into strings. Enhance this by modifying fpconv to produced fixed precision rounded output (similar to std::ostringstream << std::fixed << std::setprecision(x)).

Note: This has been implemented, and has cut down on processing time by around 20%!

Improve Marlin 1.1.x ARC Support based on the improvements of Marlin 2.0.6

Hello, thanks for this amazing lib.

I'm planning to get the Marlin 2.0.6 feature into Marlin 1.1.9 since I use my board is 8bits and I don't want to update to 2.x.
The idea is to compare the differences between the 2x algorithm with the 1.1x algorithm.
image
What you mean by greatly enhanced? What is missing on 1.1x?
Marlin 1.1.x ARC implementation: https://github.com/MarlinFirmware/Marlin/blob/1314b31d97bba8cd74c6625c47176d4692f57790/Marlin/Marlin_main.cpp#L14451
Marlin 2.x ARC implementation: https://github.com/MarlinFirmware/Marlin/blob/b9065195f1babf00ee453c39410206af90a525ae/Marlin/src/gcode/motion/G2_G3.cpp#L25

Some differences that I found:

  #ifdef MIN_ARC_SEGMENTS
    uint16_t min_segments = CEIL((MIN_ARC_SEGMENTS) * (angular_travel / RADIANS(360)));
    NOLESS(min_segments, 1U);
  #else
    constexpr uint16_t min_segments = 1;
  #endif  
  
      #ifdef MIN_ARC_SEGMENTS
      min_segments = MIN_ARC_SEGMENTS;
    #endif
    
      const feedRate_t scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s);

  // Start with a nominal segment length
  float seg_length = (
    #ifdef ARC_SEGMENTS_PER_R
      constrain(MM_PER_ARC_SEGMENT * radius, MM_PER_ARC_SEGMENT, ARC_SEGMENTS_PER_R)
    #elif ARC_SEGMENTS_PER_SEC
      _MAX(scaled_fr_mm_s * RECIPROCAL(ARC_SEGMENTS_PER_SEC), MM_PER_ARC_SEGMENT)
    #else
      MM_PER_ARC_SEGMENT
    #endif
  );
  // Divide total travel by nominal segment length
  uint16_t segments = FLOOR(mm_of_travel / seg_length);
  NOLESS(segments, min_segments);         // At least some segments
  seg_length = mm_of_travel / segments;    

#18 is also related to it, right?

What do you think about the idea?: I'm a newb about ARC Welder, how could I test the modifications? Do you have an STL file that can be used as a test? I'm using Slic3r

Another part that I'm not sure if it is the same logic or improved:
Marlin 1.1.x

      float arc_offset[2] = { 0, 0 };
      if (parser.seenval('R')) {
        const float r = parser.value_linear_units(),
                    p1 = current_position[X_AXIS], q1 = current_position[Y_AXIS],
                    p2 = destination[X_AXIS], q2 = destination[Y_AXIS];
        if (r && (p2 != p1 || q2 != q1)) {
          const float e = clockwise ^ (r < 0) ? -1 : 1,             // clockwise -1/1, counterclockwise 1/-1
                      dx = p2 - p1, dy = q2 - q1,                   // X and Y differences
                      d = HYPOT(dx, dy),                            // Linear distance between the points
                      h2 = (r - 0.5f * d) * (r + 0.5f * d),         // factor to reduce rounding error
                      h = (h2 >= 0) ? SQRT(h2) : 0.0f,              // Distance to the arc pivot-point
                      mx = (p1 + p2) * 0.5f, my = (q1 + q2) * 0.5f, // Point between the two points
                      sx = -dy / d, sy = dx / d,                    // Slope of the perpendicular bisector
                      cx = mx + e * h * sx, cy = my + e * h * sy;   // Pivot-point of the arc
          arc_offset[0] = cx - p1;
          arc_offset[1] = cy - q1;
        }
      }

Marlin 2.x

    ab_float_t arc_offset = { 0, 0 };
    if (parser.seenval('R')) {
      const float r = parser.value_linear_units();
      if (r) {
        const xy_pos_t p1 = current_position, p2 = destination;
        if (p1 != p2) {
          const xy_pos_t d2 = (p2 - p1) * 0.5f;          // XY vector to midpoint of move from current
          const float e = clockwise ^ (r < 0) ? -1 : 1,  // clockwise -1/1, counterclockwise 1/-1
                      len = d2.magnitude(),              // Distance to mid-point of move from current
                      h2 = (r - len) * (r + len),        // factored to reduce rounding error
                      h = (h2 >= 0) ? SQRT(h2) : 0.0f;   // Distance to the arc pivot-point from midpoint
          const xy_pos_t s = { -d2.y, d2.x };            // Perpendicular bisector. (Divide by len for unit vector.)
          arc_offset = d2 + s / len * e * h;             // The calculated offset (mid-point if |r| <= len)
        }
      }
    }

Missing license

This project seems to be missing a license. Is the license the same AGPL as the ArcWelderPlugin?

Add path tolerance percent argument

Add a new argument/parameter to all relevant libraries and applications to set a maximum deviation in path length as a percentage of the original length. This gives one greater control on what is acceptable deviation in terms of path length.

This should not be set too low, since an arc path will always have a different length than a segmented path, and most (all?) firmware will turn the arc back into segments.

Add advanced arc detection

This feature will slow down arcwelder a bit (10-15% more time to process), but should prevent many rare but annoying issues that can be caused by the sliced gcode traveling in an arc motion over the same spot one or many times. I honestly didn't think this was possible, but I believe it can happen if the 'overlap' percentage is so high that arcs totally overlap within the selected resolution. As a bonus, it means you can crank the path tolerance percentage way up without any issues. The path tolerance percent is still useful, but now you can increase it without worrying about bad arcs (if I have implemented it correctly).

Faceted Surface

As originally presented to you on Discord. Faceting on curved surface which doesn't appear to coincide with the patterns on the original CAD file. I have included the original .stp and prusaslicer gcode w/ and w/o ArcWelder. I can confirm the print does contain the faceting I see in the viewer at least the best I can tell. It's a small part. Printed in PEKK which is semi translucent. I cant capture the detail with a camera so I didnt add a picture
aw.zip

[Feature Request] Embedded GCode Parameter/Cmd to cache and save AW Console Output to generated file.

Good day. The thought is a request to enable console output to be cached and then written into the output gcode generated by AW. This behavior could triggered by an embedded gcode AW Script Comment - think of how you're catching slicer config by way of comments on Octolapse. The reason for this is that when AW is called from the Cura Plugin, the console output is seemingly lost to the ethers once the tool completes running. It would certainly be nice to be able to see the CLI parameters passed to it by the slicer plugin, and the dialog/debug content normally displayed in the console, when one reviews the final gcode generated by AWL.

Feature Request - ArcWelderConsole parameter for log output filename

Low priority but I would love to have a parameter in ArcWelderConsole that allows us to direct log output to a named file instead of stdout. I use the ArcWelder.exe postprocessor with PrusaSlicer and Prusa does not provide any way (that I've found) to capture the console output. The window opens and closes before I can see the log. I'd like to be able to see what was accomplished.

[FR] G5 Bezier cubic spline

It might worth adding a branch for G5 interpolation for playing around.

This study compares G1 (linear) / G2_3 (arc) / G5 (cubic spline) movements and concludes:
https://www.sciencedirect.com/science/article/pii/S2351978919311059

The authors already started monetizing on it:
https://www.ulendo.io/
https://www.kickstarter.com/projects/s2a/ulendo-better-faster-3d-printing

Add arc welder settings to gcode comments

Hi,
it would be useful if postprocessed gcode files would reflect the settings used to prostprocess in the comments gcode file, just like slicers add their settings. Something like

; postprocessed by [ArcWelder](https://github.com/FormerLurker/ArcWelderLib)
; arc_welder_resolution_mm = 0.05
; arc_welder_g90_influences_extruder = 0

No heatup (build plate and nozzle) when used with Cura and Ultimaker 2+

Generated gcode with Cura and ran it through AW command-line.
When I load up the file in the UM2+, it starts printing right away without heating up the build plate and nozzle. The original file doesn't have this problem.
I tried with the Cura plugin and got the same results.
I ran the same STL in Simplify3D and ran AW on the gcode. Everything worked fine so it seems the issue is really with the gcode coming out of Cura.

Both gcode files are available in the aw.zip file.
Original file: UM2_high_side.gcode
Arc Welded file : high_side.aw.gcode

aw.zip

Add Firmware Compensation for Older Arc Interpolation

Some firmware, especially those based on an older version of Marlin, have only the MM_PER_ARC_SEGMENT setting to control arc interpolation. The default value is 1mm, which can result in noticeably flat edges on smaller arcs. This can be somewhat compensated for within the arc generation routine at the cost of less compression.

Add two new command line parameters to the console app:

--mm-per-arc-segment (-s) - The value of the MM_PER_ARC_SEGMENT define within the compiled firmware
--min-arc-segments (-a) - This will simulate the MIN_ARC_SEGMENTS firmware parameter

The general idea is that when an arc is created we will check how may segments would be interpolated along a circle of the same radius using the MM_PER_ARC_SEGMENT value. If it is less than MIN_ARC_SEGMENTS, then we will check the length of the current arc and see if that length divided by the circumference of a circle with the same radius would produce MIN_ARC_SEGMENTS arcs. If it does, the arc will be created. If not, the G2/G3 will be left alone.

The effect of this will be that in some cases no arcs will be generated at all for some circles. In other cases, instead of having an individual arc, it will be split up into multiple arcs. This obviously isn't a perfect solution, but it does provide many of the benefits Arc Welder was designed for, while allowing for more accurate prints, even without the fancy new arc interpolation firmware settings. This will be especially useful when a user can't recompile their firmware for various reasons.

Here is an example of two rows of circles, one separated and the other joined. Both rows start with a radius of 0.1mm and end at 4.7mm. This is the gcode produced by Prusa Slicer as visualized by NCViewer:

image

Here is gcode produced from the standard Arc Welder algorithm:

image

You can see that arcs are generated even for the smallest circles. These would not look very good on firmware with MM_PER_ARC_SEGMENT = 1, since many of these circles are less than 1MM in radius! Here is what happened when I turned firmware compensation on:

image

Here I used a value of 12 for Min Arc Segments and 1mm for MM Per Arc Segment You can see that as the circles get smaller and smaller, fewer and fewer arcs are generated. At a radius of about 3.6mm, full arc generation is seen. At 0.1mm, no arcs are generated at all.

Here is a close up of the original gcode with a high number of segments:

image

And here is the same figure using Arc Welder and the new firmware compensation settings I mentioned above:

image

Feedback for V1.1.1

Please let me know if you've used the new build of ArcWelder or any of the associated libraries. I would love to know what you like, what you don't, what you love, and what you hate. If you have discovered any bugs, please mention those here. I may ask you to create a separate issue for any newly discovered bugs.

Thank you all so much! Without you all I couldn't have done this, and I'm feeling really good about the core algorithm now.

Add firmware setting parameters to the inverse processor.

Previously the inverse processor had hard-coded firmware simulation parameters. This is because that project is primarily used to test either gcode produced by ArcWelder, or to simulate various firmware changes I've been tinkering with. However, I recently found it useful to add the available parameters to the console app, and maybe others will too.

Here is what can currently be controlled (not all of these are standard marlin settings):

mm-per-arc-segment - The default segment length.
min-mm-per-arc-segment - (non-standard) - the smallest any segment can be.
min-arc-segments - The minimum number of interpolated segments in a circle of the same radius as the arc being drawn (restricted by min-mm-per-arc-segment)
arc-segments-per-second - The number of arcs per second that will be produced. Clamped between min-mm-per-arc-segment and mm-per-arc-segment.

ArcWelder fails with UnicodeEncodeError: 'ascii' codec can't encode character

OS: Linux
Environment: Cura Version: 4.8 master (Mark Burdon), Cura-mb-master-x86_64-20201121.AppImage
Cura-ArcWelder plugin: https://github.com/5axes/Cura-ArcWelderPlugin
ArcWelderLib: d3376dd

Welding a G-code containing Unicode characters (like 'ยฐC') fails (see also FormerLurker/ArcWelderPlugin#84).

2020-12-18 08:28:30,458 - DEBUG - [MainThread] LocalFileOutputDevice.LocalFileOutputDevice.requestWrite [130]: Writing to [/home/
 jorschiedt/Development/3D-Print/Things/Nefertiti/Nefertiti-aw-cooper.3mf]...
 2020-12-18 08:28:30,459 - ERROR - [MainThread] PostProcessingPlugin.PostProcessingPlugin.execute [99]: Already post processed
 2020-12-18 08:28:30,681 - ERROR - [MainThread] UM.Logger.logException [107]: Exception: Unable to write to file Nefertiti-aw-
 cooper: 'ascii' codec can't encode character '\xb0' in position 2814: ordinal not in range(128)
 2020-12-18 08:28:30,702 - ERROR - [MainThread] UM.Logger.logException [111]: Traceback (most recent call last):
 2020-12-18 08:28:30,716 - ERROR - [MainThread] UM.Logger.logException [111]:   File "/home/markb/3dp/cura/cura-build.git/build/
 inst/lib/python3/dist-packages/UM/Qt/Bindings/OutputDeviceManagerProxy.py", line 150, in _writeToDevice
 2020-12-18 08:28:30,726 - ERROR - [MainThread] UM.Logger.logException [111]:   File "/tmp/.mount_Cura-m9VAAmF/usr/bin/plugins/
 LocalFileOutputDevice/LocalFileOutputDevice.py", line 137, in requestWrite
 2020-12-18 08:28:30,734 - ERROR - [MainThread] UM.Logger.logException [111]:     self.writeStarted.emit(self)
 2020-12-18 08:28:30,740 - ERROR - [MainThread] UM.Logger.logException [111]:   File "/home/markb/3dp/cura/cura-build.git/build/
 inst/lib/python3/dist-packages/UM/Signal.py", line 219, in emit
 2020-12-18 08:28:30,747 - ERROR - [MainThread] UM.Logger.logException [111]:   File "/home/markb/3dp/cura/cura-build.git/build/
 inst/lib/python3/dist-packages/UM/Signal.py", line 336, in __performEmit
 2020-12-18 08:28:30,759 - ERROR - [MainThread] UM.Logger.logException [111]:   File "/home/markb/3dp/cura/cura-build.git/build/
 inst/lib/python3/dist-packages/UM/Signal.py", line 219, in emit
 2020-12-18 08:28:30,765 - ERROR - [MainThread] UM.Logger.logException [111]:   File "/home/markb/3dp/cura/cura-build.git/build/
 inst/lib/python3/dist-packages/UM/Signal.py", line 332, in __performEmit
 2020-12-18 08:28:30,771 - ERROR - [MainThread] UM.Logger.logException [111]:   File "/home/strolch/.local/share/cura/master/
 plugins/Cura-ArcWelderPlugin/ArcWelderPlugin.py", line 186, in _filterGcode
 2020-12-18 08:28:30,778 - ERROR - [MainThread] UM.Logger.logException [111]:     temporary_file.write(joined_gcode)
 2020-12-18 08:28:30,786 - ERROR - [MainThread] UM.Logger.logException [111]: UnicodeEncodeError: 'ascii' codec can't encode
 character '\xb0' in position 2814: ordinal not in range(128)
 2020-12-18 08:28:31,570 - INFO - [MainThread] SliceInfoPlugin.SliceInfo._onRequestFinished [284]: SliceInfo sent successfully

Install problem in octoprint (docker)

Installing plugin "Arc Welder" from https://github.com/FormerLurker/ArcWelderPlugin/archive/master.zip...
/usr/local/bin/python -m pip --disable-pip-version-check install file:///tmp/tmpo8ts61zl/ArcWelderPlugin-master.zip --no-cache-dir
Processing /tmp/tmpo8ts61zl/ArcWelderPlugin-master.zip
Requirement already satisfied: six in /usr/local/lib/python3.8/site-packages (from Arc-Welder==1.0.0+u.bb71e8f) (1.15.0)
Requirement already satisfied: OctoPrint>1.3.8 in /usr/local/lib/python3.8/site-packages (from Arc-Welder==1.0.0+u.bb71e8f) (1.5.3)
Requirement already satisfied: setuptools>=6.0 in /usr/local/lib/python3.8/site-packages (from Arc-Welder==1.0.0+u.bb71e8f) (53.0.0)
Requirement already satisfied: Flask-Babel<2,>=1.0 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.0.0)
Requirement already satisfied: PyYAML<6,>=5.3.1 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (5.4.1)
Requirement already satisfied: wrapt<2,>=1.12.1 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.12.1)
Requirement already satisfied: werkzeug<2,>=1.0.1 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.0.1)
Requirement already satisfied: netifaces<1,>=0.10.9 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.10.9)
Requirement already satisfied: OctoPrint-FileCheck>=2020.08.07 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (2020.8.7)
Requirement already satisfied: Flask-Login<0.6,>=0.5 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.5.0)
Requirement already satisfied: psutil<6,>=5.7 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (5.8.0)
Requirement already satisfied: flask<2,>=1.1.2 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.1.2)
Requirement already satisfied: rsa==4.0 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (4.0)
Requirement already satisfied: feedparser<7,>=6.0.2 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (6.0.2)
Requirement already satisfied: watchdog==0.10.4 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.10.4)
Requirement already satisfied: blinker<2,>=1.4 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.4)
Requirement already satisfied: netaddr<1,>=0.7.19 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.8.0)
Requirement already satisfied: markdown<3.2,>=3.1 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (3.1.1)
Requirement already satisfied: frozendict<2,>=1.2 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.2)
Requirement already satisfied: zeroconf<0.25,>=0.24 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.24.5)
Requirement already satisfied: markupsafe<2.0,>=1.1 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.1.1)
Requirement already satisfied: Flask-Assets<3,>=2.0 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (2.0)
Requirement already satisfied: unidecode<0.05,>=0.04.14 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.4.21)
Requirement already satisfied: itsdangerous<2,>=1.1.0 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.1.0)
Requirement already satisfied: Jinja2<3,>=2.11.2 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (2.11.3)
Requirement already satisfied: semantic-version<3,>=2.8.5 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (2.8.5)
Requirement already satisfied: Click<8,>=7.1.2 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (7.1.2)
Requirement already satisfied: filetype<2,>=1.0.7 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.0.7)
Requirement already satisfied: future<1,>=0.18.2 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.18.2)
Requirement already satisfied: websocket-client<1,>=0.57 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.57.0)
Requirement already satisfied: pkginfo<2,>=1.5.0.1 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.7.0)
Requirement already satisfied: sentry-sdk<1,>=0.15.1 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.20.3)
Requirement already satisfied: tornado==5.1.1 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (5.1.1)
Requirement already satisfied: cachelib<1,>=0.1 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.1.1)
Requirement already satisfied: OctoPrint-FirmwareCheck>=2020.09.23 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (2021.2.4)
Requirement already satisfied: pyserial<4,>=3.4 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (3.5)
Requirement already satisfied: requests<3,>=2.23.0 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (2.25.1)
Requirement already satisfied: regex!=2018.11.6 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (2020.11.13)
Requirement already satisfied: pylru<2,>=1.2 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.2.0)
Requirement already satisfied: sarge==0.1.5post0 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.1.5.post0)
Requirement already satisfied: emoji<1,>=0.5.4 in /usr/local/lib/python3.8/site-packages (from OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.6.0)
Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.8/site-packages (from rsa==4.0->OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.4.8)
Requirement already satisfied: pathtools>=0.1.1 in /usr/local/lib/python3.8/site-packages (from watchdog==0.10.4->OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.1.2)
Requirement already satisfied: sgmllib3k in /usr/local/lib/python3.8/site-packages (from feedparser<7,>=6.0.2->OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.0.0)
Requirement already satisfied: webassets>=2.0 in /usr/local/lib/python3.8/site-packages (from Flask-Assets<3,>=2.0->OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (2.0)
Requirement already satisfied: pytz in /usr/local/lib/python3.8/site-packages (from Flask-Babel<2,>=1.0->OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (2021.1)
Requirement already satisfied: Babel>=2.3 in /usr/local/lib/python3.8/site-packages (from Flask-Babel<2,>=1.0->OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (2.9.0)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.8/site-packages (from requests<3,>=2.23.0->OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (1.26.3)
Requirement already satisfied: chardet<5,>=3.0.2 in /usr/local/lib/python3.8/site-packages (from requests<3,>=2.23.0->OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (4.0.0)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.8/site-packages (from requests<3,>=2.23.0->OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (2020.12.5)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.8/site-packages (from requests<3,>=2.23.0->OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (2.10)
Requirement already satisfied: ifaddr in /usr/local/lib/python3.8/site-packages (from zeroconf<0.25,>=0.24->OctoPrint>1.3.8->Arc-Welder==1.0.0+u.bb71e8f) (0.1.7)
Building wheels for collected packages: Arc-Welder
Building wheel for Arc-Welder (setup.py): started
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-3763e_9s/setup.py'"'"'; __file__='"'"'/tmp/pip-req-build-3763e_9s/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-4i1uq7s8
cwd: /tmp/pip-req-build-3763e_9s/
Complete output (97 lines):
Unknown Version, falling back to 1.0.0+u.bb71e8f.
Found packages: {'octoprint_arc_welder', 'octoprint_arc_welder_setuptools'}
running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.8
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder
copying octoprint_arc_welder/utilities.py -> build/lib.linux-x86_64-3.8/octoprint_arc_welder
copying octoprint_arc_welder/log.py -> build/lib.linux-x86_64-3.8/octoprint_arc_welder
copying octoprint_arc_welder/preprocessor.py -> build/lib.linux-x86_64-3.8/octoprint_arc_welder
copying octoprint_arc_welder/_version.py -> build/lib.linux-x86_64-3.8/octoprint_arc_welder
copying octoprint_arc_welder/__init__.py -> build/lib.linux-x86_64-3.8/octoprint_arc_welder
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder_setuptools
copying octoprint_arc_welder_setuptools/__init__.py -> build/lib.linux-x86_64-3.8/octoprint_arc_welder_setuptools
running egg_info
creating Arc_Welder.egg-info
writing Arc_Welder.egg-info/PKG-INFO
writing dependency_links to Arc_Welder.egg-info/dependency_links.txt
writing entry points to Arc_Welder.egg-info/entry_points.txt
writing requirements to Arc_Welder.egg-info/requires.txt
writing top-level names to Arc_Welder.egg-info/top_level.txt
writing manifest file 'Arc_Welder.egg-info/SOURCES.txt'
reading manifest file 'Arc_Welder.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching 'README.md'
writing manifest file 'Arc_Welder.egg-info/SOURCES.txt'
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/data
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/arc_welder
copying octoprint_arc_welder/data/lib/c/arc_welder/arc_welder.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/arc_welder
copying octoprint_arc_welder/data/lib/c/arc_welder/segmented_arc.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/arc_welder
copying octoprint_arc_welder/data/lib/c/arc_welder/segmented_shape.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/arc_welder
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/array_list.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/circular_buffer.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/extruder.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/gcode_comment_processor.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/gcode_parser.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/gcode_position.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/logger.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/parsed_command.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/parsed_command_parameter.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/position.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/utilities.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/py_arc_welder
copying octoprint_arc_welder/data/lib/c/py_arc_welder/py_arc_welder.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/py_arc_welder
copying octoprint_arc_welder/data/lib/c/py_arc_welder/py_arc_welder_extension.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/py_arc_welder
copying octoprint_arc_welder/data/lib/c/py_arc_welder/py_logger.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/py_arc_welder
copying octoprint_arc_welder/data/lib/c/py_arc_welder/python_helpers.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/py_arc_welder
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/static
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/css
copying octoprint_arc_welder/static/css/arc_welder.css -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/css
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.delete_source.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.enabled.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.file_processing.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.g90_g91_influences_extruder.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.max_radius_mm.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.overwrite_source_file.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.resolution_mm.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.show_completed_notification.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.show_progress_bar.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.show_started_notification.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.target_postfix.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.target_prefix.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.use_octoprint_settings.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/js
copying octoprint_arc_welder/static/js/arc_welder.js -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/js
copying octoprint_arc_welder/static/js/arc_welder.settings.js -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/js
copying octoprint_arc_welder/static/js/markdown_help.js -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/js
copying octoprint_arc_welder/static/js/pnotify_extensions.js -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/js
copying octoprint_arc_welder/static/js/showdown.min.js -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/js
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/templates
copying octoprint_arc_welder/templates/arc_welder_settings.jinja2 -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/templates
copying octoprint_arc_welder/templates/arc_welder_settings_about.jinja2 -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/templates
copying octoprint_arc_welder/templates/arc_welder_tab.jinja2 -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/templates
UPDATING build/lib.linux-x86_64-3.8/octoprint_arc_welder/_version.py
set build/lib.linux-x86_64-3.8/octoprint_arc_welder/_version.py to '0+unknown'
running build_ext
Compiling PyGcodeArcConverter Extension with <distutils.unixccompiler.UnixCCompiler object at 0x7f5f31ae8730>.
Unable to remove -Wstrict-prototypes or to add -Wno-unknown-pragmas.
Building Extensions for PyArcWelder - extra_compile_args:['-O3', '-std=c++11', '-Wno-unknown-pragmas', '-v'] - extra_link_args:[]
building 'PyArcWelder' extension
creating build/temp.linux-x86_64-3.8
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder/data
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder/data/lib
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/arc_welder
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/py_arc_welder
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -Ioctoprint_arc_welder/data/lib/c/arc_welder -Ioctoprint_arc_welder/data/lib/c/gcode_processor_lib -Ioctoprint_arc_welder/data/lib/c/py_arc_welder -I/usr/local/include/python3.8 -c octoprint_arc_welder/data/lib/c/gcode_processor_lib/array_list.cpp -o build/temp.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib/array_list.o -O3 -std=c++11 -Wno-unknown-pragmas -v
unable to execute 'gcc': No such file or directory
error: command 'gcc' failed with exit status 1
----------------------------------------
ERROR: Failed building wheel for Arc-Welder
Building wheel for Arc-Welder (setup.py): finished with status 'error'
Running setup.py clean for Arc-Welder
Failed to build Arc-Welder
Installing collected packages: Arc-Welder
Running setup.py install for Arc-Welder: started
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-3763e_9s/setup.py'"'"'; __file__='"'"'/tmp/pip-req-build-3763e_9s/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-x_5096ew/install-record.txt --single-version-externally-managed --user --prefix= --compile --install-headers /octoprint/plugins/include/python3.8/Arc-Welder
cwd: /tmp/pip-req-build-3763e_9s/
Complete output (97 lines):
Unknown Version, falling back to 1.0.0+u.bb71e8f.
Found packages: {'octoprint_arc_welder_setuptools', 'octoprint_arc_welder'}
running install
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.8
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder_setuptools
copying octoprint_arc_welder_setuptools/__init__.py -> build/lib.linux-x86_64-3.8/octoprint_arc_welder_setuptools
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder
copying octoprint_arc_welder/utilities.py -> build/lib.linux-x86_64-3.8/octoprint_arc_welder
copying octoprint_arc_welder/log.py -> build/lib.linux-x86_64-3.8/octoprint_arc_welder
copying octoprint_arc_welder/preprocessor.py -> build/lib.linux-x86_64-3.8/octoprint_arc_welder
copying octoprint_arc_welder/_version.py -> build/lib.linux-x86_64-3.8/octoprint_arc_welder
copying octoprint_arc_welder/__init__.py -> build/lib.linux-x86_64-3.8/octoprint_arc_welder
running egg_info
creating Arc_Welder.egg-info
writing Arc_Welder.egg-info/PKG-INFO
writing dependency_links to Arc_Welder.egg-info/dependency_links.txt
writing entry points to Arc_Welder.egg-info/entry_points.txt
writing requirements to Arc_Welder.egg-info/requires.txt
writing top-level names to Arc_Welder.egg-info/top_level.txt
writing manifest file 'Arc_Welder.egg-info/SOURCES.txt'
reading manifest file 'Arc_Welder.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching 'README.md'
writing manifest file 'Arc_Welder.egg-info/SOURCES.txt'
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/data
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/arc_welder
copying octoprint_arc_welder/data/lib/c/arc_welder/arc_welder.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/arc_welder
copying octoprint_arc_welder/data/lib/c/arc_welder/segmented_arc.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/arc_welder
copying octoprint_arc_welder/data/lib/c/arc_welder/segmented_shape.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/arc_welder
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/array_list.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/circular_buffer.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/extruder.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/gcode_comment_processor.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/gcode_parser.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/gcode_position.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/logger.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/parsed_command.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/parsed_command_parameter.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/position.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
copying octoprint_arc_welder/data/lib/c/gcode_processor_lib/utilities.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/py_arc_welder
copying octoprint_arc_welder/data/lib/c/py_arc_welder/py_arc_welder.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/py_arc_welder
copying octoprint_arc_welder/data/lib/c/py_arc_welder/py_arc_welder_extension.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/py_arc_welder
copying octoprint_arc_welder/data/lib/c/py_arc_welder/py_logger.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/py_arc_welder
copying octoprint_arc_welder/data/lib/c/py_arc_welder/python_helpers.cpp -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/py_arc_welder
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/static
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/css
copying octoprint_arc_welder/static/css/arc_welder.css -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/css
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.delete_source.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.enabled.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.file_processing.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.g90_g91_influences_extruder.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.max_radius_mm.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.overwrite_source_file.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.resolution_mm.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.show_completed_notification.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.show_progress_bar.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.show_started_notification.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.target_postfix.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.target_prefix.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
copying octoprint_arc_welder/static/docs/help/settings.use_octoprint_settings.md -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/docs/help
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/js
copying octoprint_arc_welder/static/js/arc_welder.js -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/js
copying octoprint_arc_welder/static/js/arc_welder.settings.js -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/js
copying octoprint_arc_welder/static/js/markdown_help.js -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/js
copying octoprint_arc_welder/static/js/pnotify_extensions.js -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/js
copying octoprint_arc_welder/static/js/showdown.min.js -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/static/js
creating build/lib.linux-x86_64-3.8/octoprint_arc_welder/templates
copying octoprint_arc_welder/templates/arc_welder_settings.jinja2 -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/templates
copying octoprint_arc_welder/templates/arc_welder_settings_about.jinja2 -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/templates
copying octoprint_arc_welder/templates/arc_welder_tab.jinja2 -> build/lib.linux-x86_64-3.8/octoprint_arc_welder/templates
UPDATING build/lib.linux-x86_64-3.8/octoprint_arc_welder/_version.py
set build/lib.linux-x86_64-3.8/octoprint_arc_welder/_version.py to '0+unknown'
running build_ext
Compiling PyGcodeArcConverter Extension with <distutils.unixccompiler.UnixCCompiler object at 0x7f5ee6d67940>.
Unable to remove -Wstrict-prototypes or to add -Wno-unknown-pragmas.
Building Extensions for PyArcWelder - extra_compile_args:['-O3', '-std=c++11', '-Wno-unknown-pragmas', '-v'] - extra_link_args:[]
building 'PyArcWelder' extension
creating build/temp.linux-x86_64-3.8
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder/data
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder/data/lib
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/arc_welder
creating build/temp.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/py_arc_welder
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -Ioctoprint_arc_welder/data/lib/c/arc_welder -Ioctoprint_arc_welder/data/lib/c/gcode_processor_lib -Ioctoprint_arc_welder/data/lib/c/py_arc_welder -I/usr/local/include/python3.8 -c octoprint_arc_welder/data/lib/c/gcode_processor_lib/array_list.cpp -o build/temp.linux-x86_64-3.8/octoprint_arc_welder/data/lib/c/gcode_processor_lib/array_list.o -O3 -std=c++11 -Wno-unknown-pragmas -v
unable to execute 'gcc': No such file or directory
error: command 'gcc' failed with exit status 1
----------------------------------------
ERROR: Command errored out with exit status 1: /usr/local/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-3763e_9s/setup.py'"'"'; __file__='"'"'/tmp/pip-req-build-3763e_9s/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-x_5096ew/install-record.txt --single-version-externally-managed --user --prefix= --compile --install-headers /octoprint/plugins/include/python3.8/Arc-Welder Check the logs for full command output.
Running setup.py install for Arc-Welder: finished with status 'error'
Error!
Could not parse output from pip, see plugin_pluginmanager_console.log for generated output

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.