; 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 sub ; o call [mode] [x][y] [diameter] [fincut] ; #1=mode #2=x #3=y #4=diameter #5=fincut # = [FIX[#1/1] MOD 2 EQ 1] # = [FIX[#1/8] MOD 2 EQ 1] # = [FIX[#1/1] MOD 2 EQ 0] # = [FIX[#1/8] MOD 2 EQ 0] G90 G90.1 M101 G17 # = #5410 # = [#/2] o1 if [EXISTS[#<_z_clearance>]] # = #<_z_clearance> o1 else # = #<_z_top> o1 endif ; lead-in arc radius: capped at tool radius, 15% of pocket diameter, ; and available clearance between tool and pocket wall # = # o10 if [# GT [#4*0.15]] # = [#4*0.15] o10 endif ; for inside cuts, also cap to available radial clearance o11 if [#] # = [[#4/2 - #] * 0.4] o12 if [# LT #] # = # o12 endif o11 endif o13 if [# LT 0.001] # = 0.001 o13 endif G0 Z# o20 if [# AND #] G0 X[#2-#] Y[#3 + #4/2 - # - #] G0 Z#<_z_top> G1 Z#<_z_bot> G2 X#2 Y[#3 + #4/2 - #] I#2 J[#3 + #4/2 - # - #] G2 X#2 Y[#3 + #4/2 - #] I#2 J#3 G2 X[#2+#] Y[#3 + #4/2 - # - #] I#2 J[#3 + #4/2 - # - #] o20 elseif [# AND #] G0 X[#2+#] Y[#3 + #4/2 - # - #] G0 Z#<_z_top> G1 Z#<_z_bot> G3 X#2 Y[#3 + #4/2 - #] I#2 J[#3 + #4/2 - # - #] G3 X#2 Y[#3 + #4/2 - #] I#2 J#3 G3 X[#2-#] Y[#3 + #4/2 - # - #] I#2 J[#3 + #4/2 - # - #] o20 elseif [# AND #] G0 X[#2+#] Y[#3 + #4/2 + # + #] G0 Z#<_z_top> G1 Z#<_z_bot> G2 X#2 Y[#3 + #4/2 + #] I#2 J[#3 + #4/2 + # + #] G3 X#2 Y[#3 + #4/2 + #] I#2 J#3 G2 X[#2-#] Y[#3 + #4/2 + #+ #] I#2 J[#3 + #4/2 + # + #] o20 elseif [# AND #] G0 X[#2-#] Y[#3 + #4/2 + # + #] G0 Z#<_z_top> G1 Z#<_z_bot> G3 X#2 Y[#3 + #4/2 + #] I#2 J[#3 + #4/2 + # + #] G2 X#2 Y[#3 + #4/2 + #] I#2 J#3 G3 X[#2+#] Y[#3 + #4/2 + #+ #] I#2 J[#3 + #4/2 + # + #] o20 endif G0 Z# o endsub M2