; Circle perimeter cut - cuts inside or outside a circular profile ; Params: #1=x, #2=y, #3=diameter, #4=ztop, #5=zbot, #6=fincut, #7=mode ; Mode bitmask: bit0=conventional, bit1=bothways, bit2=plunge(vs helix), bit3=outside ; Uses arc lead-in/lead-out for smooth entry and exit o sub ; o call [x][y] [diameter] [ztop][zbot] [fincut] [mode] # = [FIX[#7/1] MOD 2 EQ 1] # = [FIX[#7/2] MOD 2 EQ 1] # = [FIX[#7/4] MOD 2 EQ 1] # = [FIX[#7/8] MOD 2 EQ 1] # = [FIX[#7/1] MOD 2 EQ 0] # = [FIX[#7/2] MOD 2 EQ 0] # = [FIX[#7/4] MOD 2 EQ 0] # = [FIX[#7/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> # = [#/2] o1 if [EXISTS[#<_z_clearance>]] # = #<_z_clearance> o1 else # = #4 o1 endif # = # ; lead-in arc radius, capped at 15% of diameter o10 if [# GT #3*0.15] # = [#3*0.15] o10 endif G0 Z# o20 if [# AND #] ; conventional, inner G0 X[#1-#] Y[#2 + #3/2 - # - #] G0 Z#4 G1 Z#5 G2 X#1 Y[#2 + #3/2 - #] I#1 J[#2 + #3/2 - # - #] G2 X#1 Y[#2 + #3/2 - #] I#1 J#2 G2 X[#1+#] Y[#2 + #3/2 - # - #] I#1 J[#2 + #3/2 - # - #] o20 elseif [# AND #] ; climb, inner G0 X[#1+#] Y[#2 + #3/2 - # - #] G0 Z#4 G1 Z#5 G3 X#1 Y[#2 + #3/2 - #] I#1 J[#2 + #3/2 - # - #] G3 X#1 Y[#2 + #3/2 - #] I#1 J#2 G3 X[#1-#] Y[#2 + #3/2 - # - #] I#1 J[#2 + #3/2 - # - #] o20 elseif [# AND #] ; conventional, outer G0 X[#1+#] Y[#2 + #3/2 + # + #] G0 Z#4 G1 Z#5 G2 X#1 Y[#2 + #3/2 + #] I#1 J[#2 + #3/2 + # + #] G3 X#1 Y[#2 + #3/2 + #] I#1 J#2 G2 X[#1-#] Y[#2 + #3/2 + #+ #] I#1 J[#2 + #3/2 + # + #] o20 elseif [# AND #] ; climb, outer G0 X[#1-#] Y[#2 + #3/2 + # + #] G0 Z#4 G1 Z#5 G3 X#1 Y[#2 + #3/2 + #] I#1 J[#2 + #3/2 + # + #] G2 X#1 Y[#2 + #3/2 + #] I#1 J#2 G3 X[#1+#] Y[#2 + #3/2 + #+ #] I#1 J[#2 + #3/2 + # + #] o20 endif G0 Z# o endsub M2