Hello, I wrote a quadrangle pocketing routine in G-Code which uses nurbs (G5.2). The motivation for this is that I dislike the current ngcgui routine (qpocket) for a couple reason. When qpocket cuts from one quad to another, "spiraling out", it actually cuts a scaled quad, then adds one edge where it slowly cuts toward the next scaled quad. That cut is really slow and is superfluous if the cut was really following a quad spiral instead. Second, and most important for me, the cut fully digs in on each corner (depending on the angle of the corner of course, but generally it is pretty big).
So the width of cut goes from the overlap set for each pass, to almost the full endmill width. Maybe not important on a big mill, but I have a mini-mill and I like to try to cut at full depth if possible and with very small overlap, on many fast passes, it gives (I think ) better finish and wears the mill more evenly. (kind of like with adaptative clearing). So the way corners are cut is really a problem with qpocket. Here is the fruit of my experiments using nurbs, pasted below. The nurb weight are scaled with an exponential as the path comes closer to the final pocket shape, to (un)round the corners progressively. The function is parametrable. The preview looks great, however, when running it, I get a path that does not follow the previewed path ! And I see no reason for the massive divergence from the programmed path. See a screenshot here: http://imagebin.ca/v/1OCw5gNzXQBF http://ibin.co/1OCw5gNzXQBF notice how the purple path has "wobbles" in some sections, which go way aside the previewed path. I tested with the sim on linuxcnc 2.5.3 At first sight it really seems to be a bug as the preview looks correct. Could anyone test this on their setup ? Is there an explanation for this ? Thanks ! Bruno Here is the test program ;;;;;;;;;;;;;;;;;;;;;; ; #<mill_number> = 5 ( some init ) G21 (Unit in mm) G90 (Absolute distance mode) G64 P0.01 (Exact Path 0.001 tol.) G17 G40 (Cancel diameter comp.) G49 (Cancel length comp.) G54 G0 X0 Y0 Z0 ( select endmill ) T[#<mill_number> ] M6 G43 ( enable tool length compensation ) G0 Z5 F300 ;;;;;;;;;;;;;;;;;;;;; G0 X20 Y20 G1 Y-20 G1 X-20 G1 Y20 G1 X20 G0 X40 Y40 G0 Y-40 G0 X-40 G0 Y40 G0 X40 G0 X0 Y0 ;;;;;;;;;;;;;;;;;;;;;;;;; ; parameters (coordinates of the corners are absolute) ( starting corner top right) #<x1> = 40 #<y1> = 40 #<x2> = 40 #<y2> = -40 #<x3> = -40 #<y3> = -40 #<x4> = -40 #<y4> = 40 #<z_safe> = 2 ( defines how the nurb weight vary) #<initial_weight> = 0.1 #<weight_mult> = 8 #<weight_offset> = 2 #<hole_radius> = 4 #<pocket_depth> = 15 ( z step for each turn when drilling down ) #<z_step> = 1 ( z step for each layer ) #<z_stepover> = 8 #<xy_stepover> = 5 ;;;;;;;;;;;;;;;;;;;;;;; o<npocket4> call [#<x1>] [#<y1>] [#<x2>] [#<y2>] [#<x3>] [#<y3>] [#<x4>] [#<y4>] [#<z_safe>] [#<initial_weight>] [#<weight_mult>] [#<weight_offset>] [#<hole_radius>] [#<pocket_depth>] [#<z_step>] [#<z_stepover>] [#<xy_stepover>] M2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; the actual subroutine: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; quadrangle pocket cutting path. ; author: Bruno Schwander ; 30 May 2014 ; This code is under the Beerware-license: ; if you use this code and find it useful, buy me a beer sometimes. ; [email protected] ; ; parameters (coordinates of the corners are absolute) ( starting corner top right) o<npocket4> sub #<x1> = #1 #<y1> = #2 #<x2> = #3 #<y2> = #4 #<x3> = #5 #<y3> = #6 #<x4> = #7 #<y4> = #8 #<z_safe> = #9 ( defines how the nurb weight vary) #<initial_weight> = #10 #<weight_mult> = #11 #<weight_offset> = #12 #<hole_radius> = #13 #<pocket_depth> = #14 ( z step for each turn when drilling down ) #<z_step> = #15 ( z step for each layer ) #<z_stepover> = #16 #<xy_stepover> = #17 ;;;;;;;;;;;;;;;;;;;;;;; #<tool_diameter> = #5410 #<midx12> = [[#<x1> + #<x2>] / 2] #<midy12> = [[#<y1> + #<y2>] / 2] #<midx23> = [[#<x2> + #<x3>] / 2] #<midy23> = [[#<y2> + #<y3>] / 2] #<midx34> = [[#<x3> + #<x4>] / 2] #<midy34> = [[#<y3> + #<y4>] / 2] #<midx41> = [[#<x4> + #<x1>] / 2] #<midy41> = [[#<y4> + #<y1>] / 2] #<xcenter> = [[#<midx12> + #<midx34>] / 2] #<ycenter> = [[#<midy12> + #<midy34>] / 2] #<dim> = SQRT[ [[[#<x1> + #<x2>] / 2]**2] + [[[#<y1> + #<y2>] / 2]**2] ] #<xy_passes> = [ #<dim> / #<xy_stepover>] #<pocket_not_finished> = 1 G90 (absolute mode) G0 X[#<xcenter>] Y[#<ycenter>] ;G42 (no tool diameter compensation with nurbs !!) o100 do #<weight> = [#<initial_weight>] (given pocket depth, find the actual z_stepover to do which can change if z_stepover is larger than what is left to pocket) o101 if [#<pocket_depth> GT #<z_stepover> ] #<z_stepdepth> = #<z_stepover> o101 else #<z_stepdepth> = #<pocket_depth> o101 endif G91 G0 X-[ #<hole_radius> ] ( drill center hole of pocket ) o102 while [ #<z_stepdepth> GE #<z_step> ] G2 Z-[#<z_step>] I[#<hole_radius>] #<z_stepdepth> = [#<z_stepdepth> - #<z_step>] #<pocket_depth> = [#<pocket_depth> - #<z_step>] o102 endwhile (must handle when z_step not a multiple of z_stepdepth) #<last_zstep> = [#<z_stepdepth> - [FIX[#<z_stepdepth> / #<z_step>] * #<z_step>] ] o103 if [#<last_zstep> GT 0] G2 Z-[#<last_zstep>] I[#<hole_radius>] #<pocket_depth> = [#<pocket_depth> - #<last_zstep>] o103 endif G2 I[ #<hole_radius> ] ( 1 turn flat to finish bottom of hole) G90 #<offset> = #<hole_radius> #<scale> = [#<offset> / #<dim>] ; go to start G0 X[ [#<midx41> - #<xcenter>]* #<scale> + #<xcenter>] Y[ [#<midy41> - #<ycenter>] * #<scale> + #<ycenter>] G5.2 X[[#<x1> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<y1> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] L3 X[[#<midx12> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<midy12> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] G5.3 #<pass_number> = 0 #<mid_index> = 1 o104 while [ [#<offset> ] LE #<dim> ] #<pass_number> = [#<pass_number> + 1] #<weight> = [#<initial_weight> + EXP[[[#<pass_number> / #<xy_passes>] * #<weight_mult>] - #<weight_offset>] ] #<offset> = [#<offset> + [0.25 * #<xy_stepover>]] #<scale> = [#<offset> / #<dim>] o300 if [ [#<offset> ] GT #<dim> ] o104 continue o300 endif G5.2 X[[#<x2> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<y2> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] L3 X[[#<midx23> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<midy23> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] G5.3 #<mid_index> = 2 #<offset> = [#<offset> + [0.25 * #<xy_stepover>]] #<scale> = [#<offset> / #<dim>] o301 if [ [#<offset> ] GT #<dim> ] o104 continue o301 endif G5.2 X[[#<x3> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<y3> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] L3 X[[#<midx34> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<midy34> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] G5.3 #<mid_index> = 3 #<offset> = [#<offset> + [0.25 * #<xy_stepover>]] #<scale> = [#<offset> / #<dim>] o302 if [ [#<offset> ] GT #<dim> ] o104 continue o302 endif G5.2 X[[#<x4> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<y4> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] L3 X[[#<midx41> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<midy41> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] G5.3 #<mid_index> = 4 #<offset> = [#<offset> + [0.25 * #<xy_stepover>]] #<scale> = [#<offset> / #<dim>] o303 if [ [#<offset> ] GT #<dim> ] o104 continue o303 endif G5.2 X[[#<x1> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<y1> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] L3 X[[#<midx12> - #<xcenter>] * #<scale> + #<xcenter>] Y[[#<midy12> - #<ycenter>] * #<scale> + #<ycenter>] P[#<weight>] G5.3 #<mid_index> = 1 o104 endwhile ; finish the corners ; ; finish pass all around ; o400 if [#<mid_index> EQ 1] G1 X[#<x2>] Y[#<y2>] G1 X[#<x3>] Y[#<y3>] G1 X[#<x4>] Y[#<y4>] G1 X[#<x1>] Y[#<y1>] G1 X[#<x2>] Y[#<y2>] o400 elseif [#<mid_index> EQ 2] G1 X[#<x3>] Y[#<y3>] G1 X[#<x4>] Y[#<y4>] G1 X[#<x1>] Y[#<y1>] G1 X[#<x2>] Y[#<y2>] G1 X[#<x3>] Y[#<y3>] o400 elseif [#<mid_index> EQ 3] G1 X[#<x4>] Y[#<y4>] G1 X[#<x1>] Y[#<y1>] G1 X[#<x2>] Y[#<y2>] G1 X[#<x3>] Y[#<y3>] G1 X[#<x4>] Y[#<y4>] o400 else ([#<mid_index> EQ 4]) G1 X[#<x1>] Y[#<y1>] G1 X[#<x2>] Y[#<y2>] G1 X[#<x3>] Y[#<y3>] G1 X[#<x4>] Y[#<y4>] G1 X[#<x1>] Y[#<y1>] o400 endif ( move back to center ) (#<current_z> = #5422 ) ( not possible to get position when cutter comp. on!) (G0 Z[#<current_z> + 1]) G91 G0 Z[#<z_safe>] G90 G0 X[#<xcenter>] Y[#<ycenter>] G91 G0 Z-[#<z_safe>] G90 ([ #<current_z> ]) o105 if [#<pocket_depth> LE 0] #<pocket_not_finished> = 0 o105 endif o100 while [ #<pocket_not_finished> ] o<npocket4> endsub ------------------------------------------------------------------------------ Time is money. Stop wasting it! Get your web API in 5 minutes. www.restlet.com/download http://p.sf.net/sfu/restlet _______________________________________________ Emc-developers mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/emc-developers
