Files
linuxcnc/nc_files/frame_rect.ngc
Thaddeus Hughes 9d2379205f claude init
2026-04-03 21:47:22 -05:00

162 lines
3.8 KiB
Plaintext
Executable File

; Rectangle perimeter cut - cuts inside or outside a rectangular frame
; Params: #1=x1, #2=y1, #3=x2, #4=y2, #5=ztop, #6=zbot, #7=mode, #8=corner_radius
; Mode bitmask: bit0=conventional, bit1=bothways, bit2=plunge(vs helix), bit3=outside
o<frame_rect> sub
; o<frame_rect> call [x1][y1] [x2][y2] [ztop][zbot] [mode] [radius]
#<M_CONVENTIONAL> = [FIX[#7/1] MOD 2 EQ 1]
#<M_BOTHWAYS> = [FIX[#7/2] MOD 2 EQ 1]
#<M_PLUNGE> = [FIX[#7/4] MOD 2 EQ 1]
#<M_OUTSIDE> = [FIX[#7/8] MOD 2 EQ 1]
#<M_CLIMB> = [FIX[#7/1] MOD 2 EQ 0]
#<M_ONEWAY> = [FIX[#7/2] MOD 2 EQ 0]
#<M_HELIX> = [FIX[#7/4] MOD 2 EQ 0]
#<M_INSIDE> = [FIX[#7/8] MOD 2 EQ 0]
;G10 L0 ; re-read tool data
G90 ; absolute x,y,z
G91.1 ; incremental i,j,k
M101 ; enable Z-axis (M102 disables)
G17 ; select XY plane for arcs
#<td> = #<_td>
#<tr> = [#<td>/2]
o1 if [EXISTS[#<_z_clearance>]]
#<z_clearance> = #<_z_clearance>
o1 else
#<z_clearance> = #4
o1 endif
#<minx> = #1
#<maxx> = #3
o3 if [#3 LT #1]
#<minx> = #3
#<maxx> = #1
o3 endif
#<miny> = #2
#<maxy> = #4
o4 if [#4 LT #2]
#<miny> = #4
#<maxy> = #2
o4 endif
G0 Z#<z_clearance>
o10 if [#<M_INSIDE> AND #<M_CONVENTIONAL>]
; CW inside: plunge in center, traverse to wall, trace perimeter
G0 X[[#1+#3]/2] Y[[#2+#4]/2]
G0 Z#5
G1 Z#6
G1 X[#<maxx>-#<tr>]
o102 if [#8 GT #<tr>]
G1 Y[#<miny>+#8]
G2 X[#<maxx>-#8] Y[#<miny>+#<tr>] J0 I[-#8+#<tr>]
G1 X[#<minx>+#8]
G2 Y[#<miny>+#8] X[#<minx>+#<tr>] I0 J[+#8-#<tr>]
G1 Y[#<maxy>-#8]
G2 X[#<minx>+#8] Y[#<maxy>-#<tr>] J0 I[+#8-#<tr>]
G1 X[#<maxx>-#8]
G2 Y[#<maxy>-#8] X[#<maxx>-#<tr>] I0 J[-#8+#<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[[#2+#4]/2]
; go to center and pull out
G0 X[[#1+#3]/2] Y[[#2+#4]/2]
G0 Z#5
o10 elseif [#<M_INSIDE> AND #<M_CLIMB>]
; CCW inside: plunge in center, trace perimeter counterclockwise
G0 X[[#1+#3]/2] Y[[#2+#4]/2]
G0 Z#5
G1 Z#6
G1 X[#<maxx>-#<tr>]
o101 if [#8 GT #<tr>]
G1 Y[#<maxy>-#8]
G3 X[#<maxx>-#8] Y[#<maxy>-#<tr>] J0 I[-#8+#<tr>]
G1 X[#<minx>+#8]
G3 Y[#<maxy>-#8] X[#<minx>+#<tr>] I0 J[-#8+#<tr>]
G1 Y[#<miny>+#8]
G3 X[#<minx>+#8] Y[#<miny>+#<tr>] J0 I[+#8-#<tr>]
G1 X[#<maxx>-#8]
G3 Y[#<miny>+#8] X[#<maxx>-#<tr>] I0 J[+#8-#<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[[#2+#4]/2]
; go to center and pull out
G0 X[[#1+#3]/2] Y[[#2+#4]/2]
G0 Z#5
o10 elseif [#<M_OUTSIDE> AND #<M_CONVENTIONAL>]
; CW outside: plunge at corner, trace perimeter offset outward
G0 X[#<minx>-#<tr>] Y[#<maxy>+#<tr>]
G0 Z#5
G1 Z#6
o104 if [#8 GT 0]
G1 Y[#<miny>+#8]
G3 X[#<minx>+#8] Y[#<miny>-#<tr>] J0 I[+#8+#<tr>]
G1 X[#<maxx>-#8]
G3 Y[#<miny>+#8] X[#<maxx>+#<tr>] I0 J[+#8+#<tr>]
G1 Y[#<maxy>-#8]
G3 X[#<maxx>-#8] Y[#<maxy>+#<tr>] J0 I[-#8-#<tr>]
G1 X[#<minx>+#8]
G3 Y[#<maxy>-#8] X[#<minx>-#<tr>] I0 J[-#8-#<tr>]
o104 else
G1 Y[#<miny>-#<tr>]
G1 X[#<maxx>+#<tr>]
G1 Y[#<maxy>+#<tr>]
G1 X[#<minx>-#<tr>]
o104 endif
G0 Z#5
o10 elseif [#<M_OUTSIDE> AND #<M_CLIMB>]
; CCW outside: plunge at corner, trace perimeter offset outward
G0 X[#<minx>-#<tr>] Y[#<miny>-#<tr>]
G0 Z#5
G1 Z#6
o103 if [#8 GT 0]
G1 Y[#<maxy>-#8]
G2 X[#<minx>+#8] Y[#<maxy>+#<tr>] J0 I[+#8+#<tr>]
G1 X[#<maxx>-#8]
G2 Y[#<maxy>-#8] X[#<maxx>+#<tr>] I0 J[-#8-#<tr>]
G1 Y[#<miny>+#8]
G2 X[#<maxx>-#8] Y[#<miny>-#<tr>] J0 I[-#8-#<tr>]
G1 X[#<minx>+#8]
G2 Y[#<miny>+#8] X[#<minx>-#<tr>] I0 J[+#8+#<tr>]
o103 else
G1 Y[#<maxy>+#<tr>]
G1 X[#<maxx>+#<tr>]
G1 Y[#<miny>-#<tr>]
G1 X[#<minx>-#<tr>]
o103 endif
G0 Z#5
o10 endif
o<frame_rect> endsub
M2