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

92 lines
3.3 KiB
Plaintext
Executable File

; Slot/obround cut - cuts a slot (stadium shape) between two endpoints
; Params: #1=x1, #2=y1, #3=x2, #4=y2, #5=width, #6=ztop, #7=zbot, #8=fincut, #9=mode
; Mode bitmask: bit0=conventional, bit1=bothways, bit2=plunge(vs helix), bit3=outside
o<slot> sub
; o<slot> call [x1][y1] [x2][y2] [width] [ztop][zbot] [fincut] [mode]
#<M_CONVENTIONAL> = [FIX[#9/1] MOD 2 EQ 1]
#<M_BOTHWAYS> = [FIX[#9/2] MOD 2 EQ 1]
#<M_PLUNGE> = [FIX[#9/4] MOD 2 EQ 1]
#<M_OUTSIDE> = [FIX[#9/8] MOD 2 EQ 1]
#<M_CLIMB> = [FIX[#9/1] MOD 2 EQ 0]
#<M_ONEWAY> = [FIX[#9/2] MOD 2 EQ 0]
#<M_HELIX> = [FIX[#9/4] MOD 2 EQ 0]
#<M_INSIDE> = [FIX[#9/8] MOD 2 EQ 0]
;G10 L0 ; re-read tool data
G90 ; absolute x,y,z
G90.1 ; absolute 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> = #5
o1 endif
#<a> = [ATAN[#4-#2]/[#3-#1]] ; slot angle from p1 to p2
G0 Z#<z_clearance>
G0 X#1 Y#2
G0 Z#6
G1 Z#7 ; plunge to cut depth
G1 X#3 Y#4 ; cut centerline of slot
#<r> = [[#5-#<_td>]/2] ; offset from centerline to slot edge (compensated for tool)
; Trace obround perimeter: two straights + two semicircles at each end
o100 if [#<M_CLIMB>]
o101 if [#8 GT 0] ; pre-finish pass offset inward by fincut
G1 X[#3 +[SIN[#<a>]*[#<r>-#8]]] Y[#4 -[COS[#<a>]*[#<r>-#8]]] ; point 1
G3 X[#3 -[SIN[#<a>]*[#<r>-#8]]] Y[#4 +[COS[#<a>]*[#<r>-#8]]] I#3 J#4 ; point 2
G1 X[#1 -[SIN[#<a>]*[#<r>-#8]]] Y[#2 +[COS[#<a>]*[#<r>-#8]]] ; point 3
G3 X[#1 +[SIN[#<a>]*[#<r>-#8]]] Y[#2 -[COS[#<a>]*[#<r>-#8]]] I#1 J#2 ; point 4
G1 X[#3 +[SIN[#<a>]*[#<r>-#8]]] Y[#4 -[COS[#<a>]*[#<r>-#8]]] ; point 1
o101 endif
G1 X[#3 +[SIN[#<a>]*[#<r>]]] Y[#4 -[COS[#<a>]*[#<r>]]] ; point 1
G3 X[#3 -[SIN[#<a>]*[#<r>]]] Y[#4 +[COS[#<a>]*[#<r>]]] I#3 J#4 ; point 2
G1 X[#1 -[SIN[#<a>]*[#<r>]]] Y[#2 +[COS[#<a>]*[#<r>]]] ; point 3
G3 X[#1 +[SIN[#<a>]*[#<r>]]] Y[#2 -[COS[#<a>]*[#<r>]]] I#1 J#2 ; point 4
G1 X[#3 +[SIN[#<a>]*[#<r>]]] Y[#4 -[COS[#<a>]*[#<r>]]] ; point 1
G0 X#3 Y#4
G0 Z#6
o100 else
o102 if [#8 GT 0]
G1 X[#3 -[SIN[#<a>]*[#<r>-#8]]] Y[#4 +[COS[#<a>]*[#<r>-#8]]] ; point 2
G2 X[#3 +[SIN[#<a>]*[#<r>-#8]]] Y[#4 -[COS[#<a>]*[#<r>-#8]]] I#3 J#4 ; point 1
G1 X[#1 +[SIN[#<a>]*[#<r>-#8]]] Y[#2 -[COS[#<a>]*[#<r>-#8]]] ; point 4
G2 X[#1 -[SIN[#<a>]*[#<r>-#8]]] Y[#2 +[COS[#<a>]*[#<r>-#8]]] I#1 J#2 ; point 3
G1 X[#3 -[SIN[#<a>]*[#<r>-#8]]] Y[#4 +[COS[#<a>]*[#<r>-#8]]] ; point 2
o102 endif
G1 X[#3 -[SIN[#<a>]*[#<r>]]] Y[#4 +[COS[#<a>]*[#<r>]]] ; point 2
G2 X[#3 +[SIN[#<a>]*[#<r>]]] Y[#4 -[COS[#<a>]*[#<r>]]] I#3 J#4 ; point 1
G1 X[#1 +[SIN[#<a>]*[#<r>]]] Y[#2 -[COS[#<a>]*[#<r>]]] ; point 4
G2 X[#1 -[SIN[#<a>]*[#<r>]]] Y[#2 +[COS[#<a>]*[#<r>]]] I#1 J#2 ; point 3
G1 X[#3 -[SIN[#<a>]*[#<r>]]] Y[#4 +[COS[#<a>]*[#<r>]]] ; point 2
o100 endif
G0 X#3 Y#4
G0 Z#<z_clearance>
o<slot> endsub
F5
o<slot> call [0] [-0.0] [0] [-0.0-0.3] [0.33] [0.1] [-0.15]
o<slot> call [0] [-1.5] [0] [-1.5-0.3] [0.33] [0.1] [-0.15]
o<slot> call [0] [-3.0] [0] [-3.0-0.3] [0.33] [0.1] [-0.15]
;o<slot> call [0] [-4.5] [0] [-4.5-0.3] [0.33] [0.1] [-0.15]
;o<slot> call [0] [-6.0] [0] [-6.0-0.3] [0.33] [0.1] [-0.15]
M2