big overhaul
This commit is contained in:
36
nc_files/subs/bore.ngc
Normal file
36
nc_files/subs/bore.ngc
Normal file
@@ -0,0 +1,36 @@
|
||||
; bore - helical boring subroutine. Spirals down in full-circle passes,
|
||||
; then a partial-arc cleanup and a spring pass at final depth.
|
||||
; Requires globals: #<_z_top>, #<_z_bot>
|
||||
; Requires tool loaded (uses #5410 for diameter)
|
||||
o<bore> sub
|
||||
; o<bore> call [x][y] [d] [stepdown]
|
||||
; #1=x #2=y #3=d #4=stepdown
|
||||
|
||||
G90
|
||||
G91.1
|
||||
|
||||
G0 X#1 Y#2
|
||||
G0 Z#<_z_top>
|
||||
G1 X[#1+#3/2-#5410/2] Y[#2]
|
||||
G17
|
||||
|
||||
#<r> = [#3/2-#5410/2]
|
||||
|
||||
#<z> = [#<_z_top> - #4]
|
||||
o101 while [#<z> GT #<_z_bot>]
|
||||
G3 X[#1+#<r>] Y[#2] I[-#<r>] Z[#<z>] P1
|
||||
#<z> = [#<z> - #4]
|
||||
o101 endwhile
|
||||
|
||||
o102 if [#<_z_top> GT #<_z_bot>]
|
||||
#<ang> = [[#<z>-#<_z_bot>]/#4*360]
|
||||
G3 X[#1+COS[#<ang>]*#<r>] Y[#2+SIN[#<ang>]*#<r>] I[-#<r>] Z[#<_z_bot>]
|
||||
G3 X[#1+COS[#<ang>]*#<r>] Y[#2+SIN[#<ang>]*#<r>] I[-COS[#<ang>]*#<r>] J[-SIN[#<ang>]*#<r>] Z[#<_z_bot>]
|
||||
o102 endif
|
||||
|
||||
G0 X#1 Y#2
|
||||
G0 Z0
|
||||
|
||||
o<bore> endsub
|
||||
|
||||
M2
|
||||
36
nc_files/subs/drill.ngc
Normal file
36
nc_files/subs/drill.ngc
Normal file
@@ -0,0 +1,36 @@
|
||||
; drill - peck-drilling subroutine
|
||||
; Requires globals: #<_z_top>, #<_z_bot>
|
||||
; Optional global: #<_z_clearance>
|
||||
o<drill> sub
|
||||
; x, y, peck
|
||||
; #1 #2 #3
|
||||
|
||||
G90 ; absolute x,y,z
|
||||
M101 ; enable Z-axis (M102 disables)
|
||||
|
||||
o2 if [EXISTS[#<_z_clearance>]]
|
||||
#<z_clearance> = #<_z_clearance>
|
||||
o2 else
|
||||
#<z_clearance> = #<_z_top>
|
||||
o2 endif
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
G0 X#1 Y#2
|
||||
G0 Z#<_z_top>
|
||||
|
||||
o104 if [#3 NE 0] ; peck drilling
|
||||
#<h> = [#<_z_top> - #3] ; first peck target (one peck below top)
|
||||
o101 while [#<h> GT #<_z_bot>]
|
||||
G1 Z#<h>
|
||||
G0 Z#<_z_top> ; full retract
|
||||
G0 Z[#<h>+.02] ; rapid back to just above previous depth
|
||||
#<h> = [#<h>-#3]
|
||||
o101 endwhile
|
||||
o104 endif
|
||||
|
||||
G1 Z#<_z_bot>
|
||||
G0 Z#<z_clearance>
|
||||
|
||||
o<drill> endsub
|
||||
|
||||
M2
|
||||
16
nc_files/subs/drill_man.ngc
Normal file
16
nc_files/subs/drill_man.ngc
Normal file
@@ -0,0 +1,16 @@
|
||||
; drill_man - positions XY, disables Z, pauses for manual drilling
|
||||
; No globals required (Z is disabled for the whole operation)
|
||||
o<drill_man> sub
|
||||
; x, y
|
||||
; #1 #2
|
||||
|
||||
G90 ; absolute x,y,z
|
||||
M102 ; disable Z-axis (M101 enables)
|
||||
|
||||
G0 X#1 Y#2
|
||||
|
||||
M0 ; pause for operator
|
||||
|
||||
o<drill_man> endsub
|
||||
|
||||
M2
|
||||
26
nc_files/subs/drill_retr.ngc
Normal file
26
nc_files/subs/drill_retr.ngc
Normal file
@@ -0,0 +1,26 @@
|
||||
; drill_retr - semi-manual drill: retracts Z, disables Z for manual plunge,
|
||||
; then re-enables and retracts on resume.
|
||||
; Optional global: #<_z_clearance> (else falls back to #<_z_top>)
|
||||
o<drill_retr> sub
|
||||
; x, y
|
||||
; #1 #2
|
||||
|
||||
G90 ; absolute x,y,z
|
||||
|
||||
o1 if [EXISTS[#<_z_clearance>]]
|
||||
#<z_clearance> = #<_z_clearance>
|
||||
o1 else
|
||||
#<z_clearance> = #<_z_top>
|
||||
o1 endif
|
||||
|
||||
M101
|
||||
G0 Z#<z_clearance>
|
||||
G0 X#1 Y#2
|
||||
M102 ; disable Z so operator can plunge manually
|
||||
M0 ; pause
|
||||
M101 ; re-enable Z
|
||||
G0 Z#<z_clearance>
|
||||
|
||||
o<drill_retr> endsub
|
||||
|
||||
M2
|
||||
84
nc_files/subs/frame_circ.ngc
Normal file
84
nc_files/subs/frame_circ.ngc
Normal file
@@ -0,0 +1,84 @@
|
||||
; frame_circ - cuts along the perimeter of a circle (inside or outside).
|
||||
; Lead-in arc capped at min(tool_radius, 15% of diameter, available_clearance).
|
||||
; Requires globals: #<_z_top>, #<_z_bot>
|
||||
; Requires tool loaded (uses #5410 for diameter)
|
||||
; Optional global: #<_z_clearance>
|
||||
o<frame_circ> sub
|
||||
; o<frame_circ> call [mode] [x][y] [diameter] [fincut]
|
||||
; #1=mode #2=x #3=y #4=diameter #5=fincut
|
||||
|
||||
#<M_CONVENTIONAL> = [FIX[#1/1] MOD 2 EQ 1]
|
||||
#<M_OUTSIDE> = [FIX[#1/8] MOD 2 EQ 1]
|
||||
#<M_CLIMB> = [FIX[#1/1] MOD 2 EQ 0]
|
||||
#<M_INSIDE> = [FIX[#1/8] MOD 2 EQ 0]
|
||||
|
||||
G90
|
||||
G90.1
|
||||
M101
|
||||
G17
|
||||
|
||||
#<td> = #5410
|
||||
#<tr> = [#<td>/2]
|
||||
o1 if [EXISTS[#<_z_clearance>]]
|
||||
#<z_clearance> = #<_z_clearance>
|
||||
o1 else
|
||||
#<z_clearance> = #<_z_top>
|
||||
o1 endif
|
||||
|
||||
; lead-in arc radius: capped at tool radius, 15% of pocket diameter,
|
||||
; and available clearance between tool and pocket wall
|
||||
#<r_entry> = #<tr>
|
||||
o10 if [#<r_entry> GT [#4*0.15]]
|
||||
#<r_entry> = [#4*0.15]
|
||||
o10 endif
|
||||
; for inside cuts, also cap to available radial clearance
|
||||
o11 if [#<M_INSIDE>]
|
||||
#<avail> = [[#4/2 - #<tr>] * 0.4]
|
||||
o12 if [#<avail> LT #<r_entry>]
|
||||
#<r_entry> = #<avail>
|
||||
o12 endif
|
||||
o11 endif
|
||||
o13 if [#<r_entry> LT 0.001]
|
||||
#<r_entry> = 0.001
|
||||
o13 endif
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
|
||||
o20 if [#<M_INSIDE> AND #<M_CONVENTIONAL>]
|
||||
G0 X[#2-#<r_entry>] Y[#3 + #4/2 - #<tr> - #<r_entry>]
|
||||
G0 Z#<_z_top>
|
||||
G1 Z#<_z_bot>
|
||||
G2 X#2 Y[#3 + #4/2 - #<tr>] I#2 J[#3 + #4/2 - #<tr> - #<r_entry>]
|
||||
G2 X#2 Y[#3 + #4/2 - #<tr>] I#2 J#3
|
||||
G2 X[#2+#<r_entry>] Y[#3 + #4/2 - #<tr> - #<r_entry>] I#2 J[#3 + #4/2 - #<tr> - #<r_entry>]
|
||||
|
||||
o20 elseif [#<M_INSIDE> AND #<M_CLIMB>]
|
||||
G0 X[#2+#<r_entry>] Y[#3 + #4/2 - #<tr> - #<r_entry>]
|
||||
G0 Z#<_z_top>
|
||||
G1 Z#<_z_bot>
|
||||
G3 X#2 Y[#3 + #4/2 - #<tr>] I#2 J[#3 + #4/2 - #<tr> - #<r_entry>]
|
||||
G3 X#2 Y[#3 + #4/2 - #<tr>] I#2 J#3
|
||||
G3 X[#2-#<r_entry>] Y[#3 + #4/2 - #<tr> - #<r_entry>] I#2 J[#3 + #4/2 - #<tr> - #<r_entry>]
|
||||
|
||||
o20 elseif [#<M_OUTSIDE> AND #<M_CONVENTIONAL>]
|
||||
G0 X[#2+#<r_entry>] Y[#3 + #4/2 + #<tr> + #<r_entry>]
|
||||
G0 Z#<_z_top>
|
||||
G1 Z#<_z_bot>
|
||||
G2 X#2 Y[#3 + #4/2 + #<tr>] I#2 J[#3 + #4/2 + #<tr> + #<r_entry>]
|
||||
G3 X#2 Y[#3 + #4/2 + #<tr>] I#2 J#3
|
||||
G2 X[#2-#<r_entry>] Y[#3 + #4/2 + #<tr>+ #<r_entry>] I#2 J[#3 + #4/2 + #<tr> + #<r_entry>]
|
||||
|
||||
o20 elseif [#<M_OUTSIDE> AND #<M_CLIMB>]
|
||||
G0 X[#2-#<r_entry>] Y[#3 + #4/2 + #<tr> + #<r_entry>]
|
||||
G0 Z#<_z_top>
|
||||
G1 Z#<_z_bot>
|
||||
G3 X#2 Y[#3 + #4/2 + #<tr>] I#2 J[#3 + #4/2 + #<tr> + #<r_entry>]
|
||||
G2 X#2 Y[#3 + #4/2 + #<tr>] I#2 J#3
|
||||
G3 X[#2+#<r_entry>] Y[#3 + #4/2 + #<tr>+ #<r_entry>] I#2 J[#3 + #4/2 + #<tr> + #<r_entry>]
|
||||
o20 endif
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
|
||||
o<frame_circ> endsub
|
||||
|
||||
M2
|
||||
138
nc_files/subs/frame_rect.ngc
Normal file
138
nc_files/subs/frame_rect.ngc
Normal file
@@ -0,0 +1,138 @@
|
||||
; frame_rect - cuts along the perimeter of a rectangle (inside or outside).
|
||||
; Supports optional corner radii.
|
||||
; Requires globals: #<_z_top>, #<_z_bot>
|
||||
; Requires tool loaded (uses #5410 for diameter)
|
||||
; Optional global: #<_z_clearance>
|
||||
o<frame_rect> sub
|
||||
; o<frame_rect> call [mode] [x1][y1] [x2][y2] [radius]
|
||||
; #1=mode #2=x1 #3=y1 #4=x2 #5=y2 #6=radius
|
||||
|
||||
#<M_CONVENTIONAL> = [FIX[#1/1] MOD 2 EQ 1]
|
||||
#<M_OUTSIDE> = [FIX[#1/8] MOD 2 EQ 1]
|
||||
#<M_CLIMB> = [FIX[#1/1] MOD 2 EQ 0]
|
||||
#<M_INSIDE> = [FIX[#1/8] MOD 2 EQ 0]
|
||||
|
||||
G90
|
||||
G91.1
|
||||
M101
|
||||
G17
|
||||
|
||||
#<td> = #5410
|
||||
#<tr> = [#<td>/2]
|
||||
o1 if [EXISTS[#<_z_clearance>]]
|
||||
#<z_clearance> = #<_z_clearance>
|
||||
o1 else
|
||||
#<z_clearance> = #<_z_top>
|
||||
o1 endif
|
||||
|
||||
#<minx> = #2
|
||||
#<maxx> = #4
|
||||
o3 if [#4 LT #2]
|
||||
#<minx> = #4
|
||||
#<maxx> = #2
|
||||
o3 endif
|
||||
#<miny> = #3
|
||||
#<maxy> = #5
|
||||
o4 if [#5 LT #3]
|
||||
#<miny> = #5
|
||||
#<maxy> = #3
|
||||
o4 endif
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
|
||||
o10 if [#<M_INSIDE> AND #<M_CONVENTIONAL>]
|
||||
G0 X[[#2+#4]/2] Y[[#3+#5]/2]
|
||||
G0 Z#<_z_top>
|
||||
G1 Z#<_z_bot>
|
||||
G1 X[#<maxx>-#<tr>]
|
||||
o102 if [#6 GT #<tr>]
|
||||
G1 Y[#<miny>+#6]
|
||||
G2 X[#<maxx>-#6] Y[#<miny>+#<tr>] J0 I[-#6+#<tr>]
|
||||
G1 X[#<minx>+#6]
|
||||
G2 Y[#<miny>+#6] X[#<minx>+#<tr>] I0 J[+#6-#<tr>]
|
||||
G1 Y[#<maxy>-#6]
|
||||
G2 X[#<minx>+#6] Y[#<maxy>-#<tr>] J0 I[+#6-#<tr>]
|
||||
G1 X[#<maxx>-#6]
|
||||
G2 Y[#<maxy>-#6] X[#<maxx>-#<tr>] I0 J[-#6+#<tr>]
|
||||
o102 else
|
||||
G1 Y[#<miny>+#<tr>]
|
||||
G1 X[#<minx>-#<tr>]
|
||||
G1 Y[#<maxy>-#<tr>]
|
||||
G1 X[#<maxx>-#<tr>]
|
||||
G1 Y[#<miny>+#<tr>]
|
||||
o102 endif
|
||||
G1 Y[[#3+#5]/2]
|
||||
G0 X[[#2+#4]/2] Y[[#3+#5]/2]
|
||||
G0 Z#<_z_top>
|
||||
|
||||
o10 elseif [#<M_INSIDE> AND #<M_CLIMB>]
|
||||
G0 X[[#2+#4]/2] Y[[#3+#5]/2]
|
||||
G0 Z#<_z_top>
|
||||
G1 Z#<_z_bot>
|
||||
G1 X[#<maxx>-#<tr>]
|
||||
o101 if [#6 GT #<tr>]
|
||||
G1 Y[#<maxy>-#6]
|
||||
G3 X[#<maxx>-#6] Y[#<maxy>-#<tr>] J0 I[-#6+#<tr>]
|
||||
G1 X[#<minx>+#6]
|
||||
G3 Y[#<maxy>-#6] X[#<minx>+#<tr>] I0 J[-#6+#<tr>]
|
||||
G1 Y[#<miny>+#6]
|
||||
G3 X[#<minx>+#6] Y[#<miny>+#<tr>] J0 I[+#6-#<tr>]
|
||||
G1 X[#<maxx>-#6]
|
||||
G3 Y[#<miny>+#6] X[#<maxx>-#<tr>] I0 J[+#6-#<tr>]
|
||||
o101 else
|
||||
G1 Y[#<maxy>-#<tr>]
|
||||
G1 X[#<minx>+#<tr>]
|
||||
G1 Y[#<miny>+#<tr>]
|
||||
G1 X[#<maxx>-#<tr>]
|
||||
G1 Y[#<maxy>-#<tr>]
|
||||
o101 endif
|
||||
G1 Y[[#3+#5]/2]
|
||||
G0 X[[#2+#4]/2] Y[[#3+#5]/2]
|
||||
G0 Z#<_z_top>
|
||||
|
||||
o10 elseif [#<M_OUTSIDE> AND #<M_CONVENTIONAL>]
|
||||
G0 X[#<minx>-#<tr>] Y[#<maxy>+#<tr>]
|
||||
G0 Z#<_z_top>
|
||||
G1 Z#<_z_bot>
|
||||
o104 if [#6 GT 0]
|
||||
G1 Y[#<miny>+#6]
|
||||
G3 X[#<minx>+#6] Y[#<miny>-#<tr>] J0 I[+#6+#<tr>]
|
||||
G1 X[#<maxx>-#6]
|
||||
G3 Y[#<miny>+#6] X[#<maxx>+#<tr>] I0 J[+#6+#<tr>]
|
||||
G1 Y[#<maxy>-#6]
|
||||
G3 X[#<maxx>-#6] Y[#<maxy>+#<tr>] J0 I[-#6-#<tr>]
|
||||
G1 X[#<minx>+#6]
|
||||
G3 Y[#<maxy>-#6] X[#<minx>-#<tr>] I0 J[-#6-#<tr>]
|
||||
o104 else
|
||||
G1 Y[#<miny>-#<tr>]
|
||||
G1 X[#<maxx>+#<tr>]
|
||||
G1 Y[#<maxy>+#<tr>]
|
||||
G1 X[#<minx>-#<tr>]
|
||||
o104 endif
|
||||
G0 Z#<_z_top>
|
||||
|
||||
o10 elseif [#<M_OUTSIDE> AND #<M_CLIMB>]
|
||||
G0 X[#<minx>-#<tr>] Y[#<miny>-#<tr>]
|
||||
G0 Z#<_z_top>
|
||||
G1 Z#<_z_bot>
|
||||
o103 if [#6 GT 0]
|
||||
G1 Y[#<maxy>-#6]
|
||||
G2 X[#<minx>+#6] Y[#<maxy>+#<tr>] J0 I[+#6+#<tr>]
|
||||
G1 X[#<maxx>-#6]
|
||||
G2 Y[#<maxy>-#6] X[#<maxx>+#<tr>] I0 J[-#6-#<tr>]
|
||||
G1 Y[#<miny>+#6]
|
||||
G2 X[#<maxx>-#6] Y[#<miny>-#<tr>] J0 I[-#6-#<tr>]
|
||||
G1 X[#<minx>+#6]
|
||||
G2 Y[#<miny>+#6] X[#<minx>-#<tr>] I0 J[+#6+#<tr>]
|
||||
o103 else
|
||||
G1 Y[#<maxy>+#<tr>]
|
||||
G1 X[#<maxx>+#<tr>]
|
||||
G1 Y[#<miny>-#<tr>]
|
||||
G1 X[#<minx>-#<tr>]
|
||||
o103 endif
|
||||
G0 Z#<_z_top>
|
||||
o10 endif
|
||||
|
||||
o<frame_rect> endsub
|
||||
|
||||
M2
|
||||
139
nc_files/subs/pocket_circ.ngc
Normal file
139
nc_files/subs/pocket_circ.ngc
Normal file
@@ -0,0 +1,139 @@
|
||||
; pocket_circ - circular pocket cut with an outward spiral from center.
|
||||
; Requires globals: #<_z_top>, #<_z_bot>
|
||||
; Requires tool loaded (uses #5410 for diameter)
|
||||
; Optional globals: #<_z_clearance>, #<_rampang>, #<_stepover>
|
||||
o<pocket_circ> sub
|
||||
; o<pocket_circ> call [mode] [x][y] [diameter] [fincut]
|
||||
; #1=mode #2=x #3=y #4=diameter #5=fincut
|
||||
|
||||
#<M_CONVENTIONAL> = [FIX[#1/1] MOD 2 EQ 1]
|
||||
#<M_PLUNGE> = [FIX[#1/4] MOD 2 EQ 1]
|
||||
#<M_CLIMB> = [FIX[#1/1] MOD 2 EQ 0]
|
||||
#<M_HELIX> = [FIX[#1/4] MOD 2 EQ 0]
|
||||
|
||||
G90
|
||||
G90.1
|
||||
M101
|
||||
G17
|
||||
|
||||
#<td> = #5410
|
||||
#<tr> = [#<td>/2]
|
||||
o1 if [EXISTS[#<_z_clearance>]]
|
||||
#<z_clearance> = #<_z_clearance>
|
||||
o1 else
|
||||
#<z_clearance> = #<_z_top>
|
||||
o1 endif
|
||||
o2 if [EXISTS[#<_rampang>]]
|
||||
#<rampang> = #<_rampang>
|
||||
o2 else
|
||||
#<rampang> = 5
|
||||
o2 endif
|
||||
o3 if [EXISTS[#<_stepover>]]
|
||||
#<stepover> = #<_stepover>
|
||||
o3 else
|
||||
#<stepover> = [#<td>*0.4]
|
||||
o3 endif
|
||||
|
||||
o4 if [#<td> GT #4]
|
||||
o5 return ; tool bigger than pocket
|
||||
o4 endif
|
||||
|
||||
#<a> = 0
|
||||
#<r> = 0
|
||||
o100 if [#<M_HELIX>]
|
||||
#<r> = [#<td>*0.3]
|
||||
o115 if [[[#4-#<td>]/2-ABS[#5]] LE #<r>]
|
||||
#<r> = [[[#4-#<td>]/2-ABS[#5]]*0.8]
|
||||
o115 endif
|
||||
|
||||
#<z_step> = [#<r>*2*3.14*TAN[#<rampang>]]
|
||||
; guard: if z_step is tiny, avoid infinite loop
|
||||
o116 if [#<z_step> LT 0.0001]
|
||||
#<z_step> = 0.0001
|
||||
o116 endif
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
G0 X[#2+#<r>] Y[#3]
|
||||
G0 Z#<_z_top>
|
||||
|
||||
#<z> = [#<_z_top>-#<z_step>]
|
||||
o101 while [#<z> GT #<_z_bot>]
|
||||
o102 if [#<M_CLIMB>]
|
||||
G3 X[#2+#<r>] Y[#3] I[#2] J[#3] Z[#<z>] P1
|
||||
o102 else
|
||||
G2 X[#2+#<r>] Y[#3] I[#2] J[#3] Z[#<z>] P1
|
||||
o102 endif
|
||||
#<z> = [#<z> - #<z_step>]
|
||||
o101 endwhile
|
||||
|
||||
; finish plunge to exact depth
|
||||
; guard: avoid division by zero if z_top == z_bot
|
||||
o117 if [ABS[#<_z_top>-#<_z_bot>] GT 0.0001]
|
||||
#<a> = [[#<z>-#<_z_bot>]/[#<_z_top>-#<_z_bot>]*360]
|
||||
o117 else
|
||||
#<a> = 0
|
||||
o117 endif
|
||||
o103 if [#<M_CLIMB>]
|
||||
G3 X[#2+COS[#<a>]*#<r>] Y[#3+SIN[#<a>]*#<r>] I[#2] J[#3] Z[#<_z_bot>]
|
||||
G3 X[#2+COS[#<a>]*#<r>] Y[#3+SIN[#<a>]*#<r>] I[#2] J[#3] Z[#<_z_bot>]
|
||||
o103 else
|
||||
G2 X[#2+COS[#<a>]*#<r>] Y[#3-SIN[#<a>]*#<r>] I[#2] J[#3] Z[#<_z_bot>]
|
||||
G2 X[#2+COS[#<a>]*#<r>] Y[#3-SIN[#<a>]*#<r>] I[#2] J[#3] Z[#<_z_bot>]
|
||||
o103 endif
|
||||
|
||||
o100 elseif [#<M_PLUNGE>]
|
||||
G0 Z#<z_clearance>
|
||||
G0 X[#2] Y[#3]
|
||||
G0 Z[#<_z_top>]
|
||||
G1 Z[#<_z_bot>]
|
||||
o100 endif
|
||||
|
||||
; spiral outward
|
||||
#<r_base> = #<r>
|
||||
#<a_base> = #<a>
|
||||
#<iter> = 0
|
||||
o105 while [#<r> LT [[#4-#<td>]/2-ABS[#5]]]
|
||||
o106 if [#<M_CLIMB>]
|
||||
G1 X[#2+COS[#<a>]*#<r>] Y[#3+SIN[#<a>]*#<r>]
|
||||
o106 else
|
||||
G1 X[#2+COS[#<a>]*#<r>] Y[#3-SIN[#<a>]*#<r>]
|
||||
o106 endif
|
||||
#<a> = [#<a>+1]
|
||||
#<r> = [#<r_base>+[#<a>-#<a_base>]/360*#<stepover>]
|
||||
#<iter> = [#<iter>+1]
|
||||
o109 if [#<iter> GT 360000]
|
||||
o105 BREAK ; safety limit
|
||||
o109 endif
|
||||
o105 endwhile
|
||||
|
||||
; pre-finish circle
|
||||
#<r> = [[#4-#<td>]/2-ABS[#5]]
|
||||
o107 if [#<M_CLIMB>]
|
||||
G1 X[#2+COS[#<a>]*#<r>] Y[#3+SIN[#<a>]*#<r>]
|
||||
G3 X[#2+COS[#<a>]*#<r>] Y[#3+SIN[#<a>]*#<r>] I[#2] J[#3]
|
||||
o107 else
|
||||
G1 X[#2+COS[#<a>]*#<r>] Y[#3-SIN[#<a>]*#<r>]
|
||||
G2 X[#2+COS[#<a>]*#<r>] Y[#3-SIN[#<a>]*#<r>] I[#2] J[#3]
|
||||
o107 endif
|
||||
|
||||
; finish cut
|
||||
o104 if [ABS[#5] GT 0.0]
|
||||
#<r> = [[#4-#<td>]/2]
|
||||
o108 if [#<M_CLIMB>]
|
||||
G1 X[#2+COS[#<a>]*#<r>] Y[#3+SIN[#<a>]*#<r>]
|
||||
G3 X[#2+COS[#<a>]*#<r>] Y[#3+SIN[#<a>]*#<r>] I[#2] J[#3]
|
||||
#<r> = [[#4-#<td>]/2*0.9]
|
||||
G1 X[#2+COS[#<a>]*#<r>] Y[#3+SIN[#<a>]*#<r>]
|
||||
o108 else
|
||||
G1 X[#2+COS[#<a>]*#<r>] Y[#3-SIN[#<a>]*#<r>]
|
||||
G2 X[#2+COS[#<a>]*#<r>] Y[#3-SIN[#<a>]*#<r>] I[#2] J[#3]
|
||||
#<r> = [[#4-#<td>]/2*0.9]
|
||||
G1 X[#2+COS[#<a>]*#<r>] Y[#3-SIN[#<a>]*#<r>]
|
||||
o108 endif
|
||||
o104 endif
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
|
||||
o<pocket_circ> endsub
|
||||
|
||||
M2
|
||||
171
nc_files/subs/pocket_rect.ngc
Normal file
171
nc_files/subs/pocket_rect.ngc
Normal file
@@ -0,0 +1,171 @@
|
||||
; pocket_rect - rectangular pocket, zigzag along the long axis.
|
||||
; Requires globals: #<_z_top>, #<_z_bot>
|
||||
; Requires tool loaded (uses #5410 for diameter)
|
||||
; Optional globals: #<_z_clearance>, #<_stepover>, #<_rampang>
|
||||
o<pocket_rect> sub
|
||||
; o<pocket_rect> call [mode] [x1][y1] [x2][y2] [fincut]
|
||||
; #1=mode #2=x1 #3=y1 #4=x2 #5=y2 #6=fincut
|
||||
|
||||
#<M_PLUNGE> = [FIX[#1/4] MOD 2 EQ 1]
|
||||
#<M_HELIX> = [FIX[#1/4] MOD 2 EQ 0]
|
||||
|
||||
G90
|
||||
G90.1
|
||||
M101
|
||||
G17
|
||||
|
||||
#<td> = #5410
|
||||
#<tr> = [#<td>/2]
|
||||
o1 if [EXISTS[#<_z_clearance>]]
|
||||
#<z_clearance> = #<_z_clearance>
|
||||
o1 else
|
||||
#<z_clearance> = #<_z_top>
|
||||
o1 endif
|
||||
o2 if [EXISTS[#<_stepover>]]
|
||||
#<stepover> = #<_stepover>
|
||||
o2 else
|
||||
#<stepover> = [#<td>*0.4]
|
||||
o2 endif
|
||||
o3 if [EXISTS[#<_rampang>]]
|
||||
#<rampang> = #<_rampang>
|
||||
o3 else
|
||||
#<rampang> = 5
|
||||
o3 endif
|
||||
|
||||
; sort coords
|
||||
#<minx> = #2
|
||||
#<maxx> = #4
|
||||
o11 if [#4 LT #2]
|
||||
#<minx> = #4
|
||||
#<maxx> = #2
|
||||
o11 endif
|
||||
#<miny> = #3
|
||||
#<maxy> = #5
|
||||
o12 if [#5 LT #3]
|
||||
#<miny> = #5
|
||||
#<maxy> = #3
|
||||
o12 endif
|
||||
|
||||
#<fincut> = #6
|
||||
o13 if [#<fincut> LT 0]
|
||||
#<fincut> = [0 - #<fincut>]
|
||||
o13 endif
|
||||
|
||||
#<tx_min> = [#<minx> + #<tr> + #<fincut>]
|
||||
#<tx_max> = [#<maxx> - #<tr> - #<fincut>]
|
||||
#<ty_min> = [#<miny> + #<tr> + #<fincut>]
|
||||
#<ty_max> = [#<maxy> - #<tr> - #<fincut>]
|
||||
|
||||
#<xrange> = [#<tx_max> - #<tx_min>]
|
||||
#<yrange> = [#<ty_max> - #<ty_min>]
|
||||
|
||||
o14 if [[#<xrange> LE 0] OR [#<yrange> LE 0]]
|
||||
o15 return
|
||||
o14 endif
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
|
||||
o20 if [#<xrange> GE #<yrange>]
|
||||
G0 X#<tx_min> Y#<ty_min>
|
||||
G0 Z#<_z_top>
|
||||
o21 if [#<M_HELIX>]
|
||||
#<r> = [#<td>*0.3]
|
||||
o22 if [[2*#<r>] GT #<xrange>]
|
||||
#<r> = [#<xrange>/2 - 0.001]
|
||||
o22 endif
|
||||
#<z_step> = [#<r>*2*3.14*TAN[#<rampang>]]
|
||||
o25 if [#<z_step> LT 0.0001]
|
||||
#<z_step> = 0.0001
|
||||
o25 endif
|
||||
G0 X[#<tx_min>+2*#<r>] Y#<ty_min>
|
||||
#<z> = [#<_z_top>-#<z_step>]
|
||||
o23 while [#<z> GT #<_z_bot>]
|
||||
G3 X[#<tx_min>+2*#<r>] Y#<ty_min> I[-#<r>] J0 Z#<z>
|
||||
#<z> = [#<z> - #<z_step>]
|
||||
o23 endwhile
|
||||
G3 X[#<tx_min>+2*#<r>] Y#<ty_min> I[-#<r>] J0 Z#<_z_bot>
|
||||
G1 X#<tx_min>
|
||||
o21 else
|
||||
G1 Z#<_z_bot>
|
||||
o21 endif
|
||||
|
||||
#<y> = #<ty_min>
|
||||
#<xa> = #<tx_min>
|
||||
#<xb> = #<tx_max>
|
||||
o30 while [1]
|
||||
G1 X#<xb> Y#<y>
|
||||
#<ynext> = [#<y> + #<stepover>]
|
||||
o31 if [#<ynext> GE #<ty_max>]
|
||||
#<ynext> = #<ty_max>
|
||||
G1 Y#<ynext>
|
||||
#<tmp> = #<xa>
|
||||
#<xa> = #<xb>
|
||||
#<xb> = #<tmp>
|
||||
G1 X#<xb>
|
||||
o30 BREAK
|
||||
o31 endif
|
||||
G1 Y#<ynext>
|
||||
#<y> = #<ynext>
|
||||
#<tmp> = #<xa>
|
||||
#<xa> = #<xb>
|
||||
#<xb> = #<tmp>
|
||||
o30 endwhile
|
||||
|
||||
o20 else
|
||||
G0 X#<tx_min> Y#<ty_min>
|
||||
G0 Z#<_z_top>
|
||||
o41 if [#<M_HELIX>]
|
||||
#<r> = [#<td>*0.3]
|
||||
o42 if [[2*#<r>] GT #<yrange>]
|
||||
#<r> = [#<yrange>/2 - 0.001]
|
||||
o42 endif
|
||||
#<z_step> = [#<r>*2*3.14*TAN[#<rampang>]]
|
||||
o45 if [#<z_step> LT 0.0001]
|
||||
#<z_step> = 0.0001
|
||||
o45 endif
|
||||
G0 X#<tx_min> Y[#<ty_min>+2*#<r>]
|
||||
#<z> = [#<_z_top>-#<z_step>]
|
||||
o43 while [#<z> GT #<_z_bot>]
|
||||
G3 X#<tx_min> Y[#<ty_min>+2*#<r>] I0 J[-#<r>] Z#<z>
|
||||
#<z> = [#<z> - #<z_step>]
|
||||
o43 endwhile
|
||||
G3 X#<tx_min> Y[#<ty_min>+2*#<r>] I0 J[-#<r>] Z#<_z_bot>
|
||||
G1 Y#<ty_min>
|
||||
o41 else
|
||||
G1 Z#<_z_bot>
|
||||
o41 endif
|
||||
|
||||
#<x> = #<tx_min>
|
||||
#<ya> = #<ty_min>
|
||||
#<yb> = #<ty_max>
|
||||
o50 while [1]
|
||||
G1 Y#<yb> X#<x>
|
||||
#<xnext> = [#<x> + #<stepover>]
|
||||
o51 if [#<xnext> GE #<tx_max>]
|
||||
#<xnext> = #<tx_max>
|
||||
G1 X#<xnext>
|
||||
#<tmp> = #<ya>
|
||||
#<ya> = #<yb>
|
||||
#<yb> = #<tmp>
|
||||
G1 Y#<yb>
|
||||
o50 BREAK
|
||||
o51 endif
|
||||
G1 X#<xnext>
|
||||
#<x> = #<xnext>
|
||||
#<tmp> = #<ya>
|
||||
#<ya> = #<yb>
|
||||
#<yb> = #<tmp>
|
||||
o50 endwhile
|
||||
o20 endif
|
||||
|
||||
G1 X#<tx_min> Y#<ty_min>
|
||||
G1 X#<tx_max> Y#<ty_min>
|
||||
G1 X#<tx_max> Y#<ty_max>
|
||||
G1 X#<tx_min> Y#<ty_max>
|
||||
G1 X#<tx_min> Y#<ty_min>
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
|
||||
o<pocket_rect> endsub
|
||||
|
||||
M2
|
||||
63
nc_files/subs/poly_frame.ngc
Normal file
63
nc_files/subs/poly_frame.ngc
Normal file
@@ -0,0 +1,63 @@
|
||||
; poly_frame - perimeter cut of a regular polygon.
|
||||
; apothem = flat-to-flat distance / 2 (center to midpoint of edge).
|
||||
; rotation in degrees: 0 places first vertex on +X axis, CCW positive.
|
||||
; Requires globals: #<_z_top>, #<_z_bot>
|
||||
; Requires tool loaded (uses #5410 for diameter)
|
||||
; Optional global: #<_z_clearance>
|
||||
o<poly_frame> sub
|
||||
; o<poly_frame> call [mode] [x][y] [n_sides] [apothem] [rotation] [fincut]
|
||||
; #1=mode #2=x #3=y #4=n_sides #5=apothem #6=rotation #7=fincut
|
||||
|
||||
#<M_CONVENTIONAL> = [FIX[#1/1] MOD 2 EQ 1]
|
||||
#<M_OUTSIDE> = [FIX[#1/8] MOD 2 EQ 1]
|
||||
#<M_CLIMB> = [FIX[#1/1] MOD 2 EQ 0]
|
||||
#<M_INSIDE> = [FIX[#1/8] MOD 2 EQ 0]
|
||||
|
||||
G90
|
||||
G90.1
|
||||
M101
|
||||
G17
|
||||
|
||||
#<td> = #5410
|
||||
#<tr> = [#<td>/2]
|
||||
o1 if [EXISTS[#<_z_clearance>]]
|
||||
#<z_clearance> = #<_z_clearance>
|
||||
o1 else
|
||||
#<z_clearance> = #<_z_top>
|
||||
o1 endif
|
||||
|
||||
o10 if [#<M_INSIDE>]
|
||||
#<effective_apothem> = [#5 - #<tr> - #7]
|
||||
o10 else
|
||||
#<effective_apothem> = [#5 + #<tr> + #7]
|
||||
o10 endif
|
||||
|
||||
#<R> = [#<effective_apothem> / COS[180/#4]]
|
||||
#<step_angle> = [360/#4]
|
||||
|
||||
o11 if [[#<M_INSIDE> AND #<M_CLIMB>] OR [#<M_OUTSIDE> AND #<M_CONVENTIONAL>]]
|
||||
#<dir> = 1
|
||||
o11 else
|
||||
#<dir> = -1
|
||||
o11 endif
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
|
||||
#<x0> = [#2 + #<R>*COS[#6]]
|
||||
#<y0> = [#3 + #<R>*SIN[#6]]
|
||||
G0 X#<x0> Y#<y0>
|
||||
G0 Z#<_z_top>
|
||||
G1 Z#<_z_bot>
|
||||
|
||||
#<i> = 1
|
||||
o20 while [#<i> LE #4]
|
||||
#<ang> = [#6 + #<dir>*#<i>*#<step_angle>]
|
||||
G1 X[#2 + #<R>*COS[#<ang>]] Y[#3 + #<R>*SIN[#<ang>]]
|
||||
#<i> = [#<i> + 1]
|
||||
o20 endwhile
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
|
||||
o<poly_frame> endsub
|
||||
|
||||
M2
|
||||
82
nc_files/subs/poly_pocket.ngc
Normal file
82
nc_files/subs/poly_pocket.ngc
Normal file
@@ -0,0 +1,82 @@
|
||||
; poly_pocket - filled polygon pocket, concentric outward from center.
|
||||
; apothem = flat-to-flat distance / 2 (center to midpoint of edge).
|
||||
; rotation in degrees: 0 places first vertex on +X axis, CCW positive.
|
||||
; Requires globals: #<_z_top>, #<_z_bot>
|
||||
; Requires tool loaded (uses #5410 for diameter)
|
||||
; Optional globals: #<_z_clearance>, #<_stepover>
|
||||
o<poly_pocket> sub
|
||||
; o<poly_pocket> call [mode] [x][y] [n_sides] [apothem] [rotation] [fincut]
|
||||
; #1=mode #2=x #3=y #4=n_sides #5=apothem #6=rotation #7=fincut
|
||||
|
||||
#<M_CONVENTIONAL> = [FIX[#1/1] MOD 2 EQ 1]
|
||||
#<M_CLIMB> = [FIX[#1/1] MOD 2 EQ 0]
|
||||
|
||||
G90
|
||||
G90.1
|
||||
M101
|
||||
G17
|
||||
|
||||
#<td> = #5410
|
||||
#<tr> = [#<td>/2]
|
||||
o1 if [EXISTS[#<_z_clearance>]]
|
||||
#<z_clearance> = #<_z_clearance>
|
||||
o1 else
|
||||
#<z_clearance> = #<_z_top>
|
||||
o1 endif
|
||||
o2 if [EXISTS[#<_stepover>]]
|
||||
#<stepover> = #<_stepover>
|
||||
o2 else
|
||||
#<stepover> = [#<td>*0.4]
|
||||
o2 endif
|
||||
|
||||
#<fincut> = #7
|
||||
o13 if [#<fincut> LT 0]
|
||||
#<fincut> = [0 - #<fincut>]
|
||||
o13 endif
|
||||
|
||||
#<max_apothem> = [#5 - #<tr> - #<fincut>]
|
||||
#<step_angle> = [360/#4]
|
||||
|
||||
o14 if [#<max_apothem> LE 0]
|
||||
o15 return
|
||||
o14 endif
|
||||
|
||||
o16 if [#<M_CLIMB>]
|
||||
#<dir> = 1
|
||||
o16 else
|
||||
#<dir> = -1
|
||||
o16 endif
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
G0 X#2 Y#3
|
||||
G0 Z#<_z_top>
|
||||
G1 Z#<_z_bot>
|
||||
|
||||
#<current_apothem> = #<stepover>
|
||||
o30 while [#<current_apothem> LT #<max_apothem>]
|
||||
#<R> = [#<current_apothem> / COS[180/#4]]
|
||||
G1 X[#2 + #<R>*COS[#6]] Y[#3 + #<R>*SIN[#6]]
|
||||
#<i> = 1
|
||||
o31 while [#<i> LE #4]
|
||||
#<ang> = [#6 + #<dir>*#<i>*#<step_angle>]
|
||||
G1 X[#2 + #<R>*COS[#<ang>]] Y[#3 + #<R>*SIN[#<ang>]]
|
||||
#<i> = [#<i> + 1]
|
||||
o31 endwhile
|
||||
#<current_apothem> = [#<current_apothem> + #<stepover>]
|
||||
o30 endwhile
|
||||
|
||||
; final pass at max_apothem
|
||||
#<R> = [#<max_apothem> / COS[180/#4]]
|
||||
G1 X[#2 + #<R>*COS[#6]] Y[#3 + #<R>*SIN[#6]]
|
||||
#<i> = 1
|
||||
o40 while [#<i> LE #4]
|
||||
#<ang> = [#6 + #<dir>*#<i>*#<step_angle>]
|
||||
G1 X[#2 + #<R>*COS[#<ang>]] Y[#3 + #<R>*SIN[#<ang>]]
|
||||
#<i> = [#<i> + 1]
|
||||
o40 endwhile
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
|
||||
o<poly_pocket> endsub
|
||||
|
||||
M2
|
||||
73
nc_files/subs/slot.ngc
Normal file
73
nc_files/subs/slot.ngc
Normal file
@@ -0,0 +1,73 @@
|
||||
; slot - slot/obround cut between two points (x1,y1) and (x2,y2).
|
||||
; Requires globals: #<_z_top>, #<_z_bot>
|
||||
; Requires tool loaded (uses #5410 for diameter)
|
||||
; Optional global: #<_z_clearance>
|
||||
o<slot> sub
|
||||
; o<slot> call [mode] [x1][y1] [x2][y2] [width] [fincut]
|
||||
; #1=mode #2=x1 #3=y1 #4=x2 #5=y2 #6=width #7=fincut
|
||||
|
||||
#<M_CONVENTIONAL> = [FIX[#1/1] MOD 2 EQ 1]
|
||||
#<M_CLIMB> = [FIX[#1/1] MOD 2 EQ 0]
|
||||
|
||||
G90
|
||||
G90.1
|
||||
M101
|
||||
G17
|
||||
|
||||
#<td> = #5410
|
||||
#<tr> = [#<td>/2]
|
||||
o1 if [EXISTS[#<_z_clearance>]]
|
||||
#<z_clearance> = #<_z_clearance>
|
||||
o1 else
|
||||
#<z_clearance> = #<_z_top>
|
||||
o1 endif
|
||||
|
||||
#<a> = [ATAN[#5-#3]/[#4-#2]]
|
||||
|
||||
G0 Z#<z_clearance>
|
||||
G0 X#2 Y#3
|
||||
G0 Z#<_z_top>
|
||||
G1 Z#<_z_bot>
|
||||
G1 X#4 Y#5
|
||||
|
||||
#<r> = [[#6-#5410]/2]
|
||||
|
||||
o100 if [#<M_CLIMB>]
|
||||
o101 if [#7 GT 0]
|
||||
G1 X[#4 +[SIN[#<a>]*[#<r>-#7]]] Y[#5 -[COS[#<a>]*[#<r>-#7]]]
|
||||
G3 X[#4 -[SIN[#<a>]*[#<r>-#7]]] Y[#5 +[COS[#<a>]*[#<r>-#7]]] I#4 J#5
|
||||
G1 X[#2 -[SIN[#<a>]*[#<r>-#7]]] Y[#3 +[COS[#<a>]*[#<r>-#7]]]
|
||||
G3 X[#2 +[SIN[#<a>]*[#<r>-#7]]] Y[#3 -[COS[#<a>]*[#<r>-#7]]] I#2 J#3
|
||||
G1 X[#4 +[SIN[#<a>]*[#<r>-#7]]] Y[#5 -[COS[#<a>]*[#<r>-#7]]]
|
||||
o101 endif
|
||||
|
||||
G1 X[#4 +[SIN[#<a>]*[#<r>]]] Y[#5 -[COS[#<a>]*[#<r>]]]
|
||||
G3 X[#4 -[SIN[#<a>]*[#<r>]]] Y[#5 +[COS[#<a>]*[#<r>]]] I#4 J#5
|
||||
G1 X[#2 -[SIN[#<a>]*[#<r>]]] Y[#3 +[COS[#<a>]*[#<r>]]]
|
||||
G3 X[#2 +[SIN[#<a>]*[#<r>]]] Y[#3 -[COS[#<a>]*[#<r>]]] I#2 J#3
|
||||
G1 X[#4 +[SIN[#<a>]*[#<r>]]] Y[#5 -[COS[#<a>]*[#<r>]]]
|
||||
|
||||
G0 X#4 Y#5
|
||||
G0 Z#<_z_top>
|
||||
o100 else
|
||||
o102 if [#7 GT 0]
|
||||
G1 X[#4 -[SIN[#<a>]*[#<r>-#7]]] Y[#5 +[COS[#<a>]*[#<r>-#7]]]
|
||||
G2 X[#4 +[SIN[#<a>]*[#<r>-#7]]] Y[#5 -[COS[#<a>]*[#<r>-#7]]] I#4 J#5
|
||||
G1 X[#2 +[SIN[#<a>]*[#<r>-#7]]] Y[#3 -[COS[#<a>]*[#<r>-#7]]]
|
||||
G2 X[#2 -[SIN[#<a>]*[#<r>-#7]]] Y[#3 +[COS[#<a>]*[#<r>-#7]]] I#2 J#3
|
||||
G1 X[#4 -[SIN[#<a>]*[#<r>-#7]]] Y[#5 +[COS[#<a>]*[#<r>-#7]]]
|
||||
o102 endif
|
||||
|
||||
G1 X[#4 -[SIN[#<a>]*[#<r>]]] Y[#5 +[COS[#<a>]*[#<r>]]]
|
||||
G2 X[#4 +[SIN[#<a>]*[#<r>]]] Y[#5 -[COS[#<a>]*[#<r>]]] I#4 J#5
|
||||
G1 X[#2 +[SIN[#<a>]*[#<r>]]] Y[#3 -[COS[#<a>]*[#<r>]]]
|
||||
G2 X[#2 -[SIN[#<a>]*[#<r>]]] Y[#3 +[COS[#<a>]*[#<r>]]] I#2 J#3
|
||||
G1 X[#4 -[SIN[#<a>]*[#<r>]]] Y[#5 +[COS[#<a>]*[#<r>]]]
|
||||
o100 endif
|
||||
|
||||
G0 X#4 Y#5
|
||||
G0 Z#<z_clearance>
|
||||
|
||||
o<slot> endsub
|
||||
|
||||
M2
|
||||
8
nc_files/subs/z_home.ngc
Normal file
8
nc_files/subs/z_home.ngc
Normal file
@@ -0,0 +1,8 @@
|
||||
; z_home - rapid Z to machine zero (quill fully up).
|
||||
; Uses G53 to bypass all offsets (work, tool, G92).
|
||||
; Safe to call any time. No arguments.
|
||||
o<z_home> sub
|
||||
G53 G0 Z0
|
||||
o<z_home> endsub
|
||||
|
||||
M2
|
||||
Reference in New Issue
Block a user