big overhaul

This commit is contained in:
Thaddeus Hughes
2026-04-05 20:51:43 -05:00
parent f39f90977d
commit ad1f8719d6
121 changed files with 2457 additions and 1700 deletions

36
nc_files/subs/bore.ngc Normal file
View 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
View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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
View 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
View 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