Python Script for doing a beveled edge

After spending several weeks trying to get Fusion 360 to output a g-code file that would create the bevels that their design screen showed me, I threw in the towel and spent two hours writing a Python script that just did what I wanted.
It’s set up right now for beveling three sides of a piece (because the project I’m working on is bigger than the A350 bed) but it would be pretty trivial to extend it to four sides or change the shape of the bevel.

import sys
def depth(x: float,bw: float):
    return -1.0*(bw-(bw**2.0-x**2.0)**0.5)

if (len(sys.argv)<3):
    print("bevelmaker <board width> <board length> <bevel width> [<step over> [<feed rate> [<spindle speed>]]]")
    print("inputs are in mm, mm/sec, rpm"
    exit()

feedRate = 400
spindleSpeed = 10000
stepOver = 0.05

brdWidth=float(sys.argv[1])
brdLength=float(sys.argv[2])
bevWidth=float(sys.argv[3])
if (len(sys.argv)>=4):
    stepOver=float(sys.argv[4])
    if (len(sys.argv)>=5):
        feedRate=float(sys.argv[5])
        if (len(sys.argv)>=6):
            spindleSpeed=float(sys.argv[6])

#print("bevelWidth:\t",bevWidth)
#print("boardWidth:\t",brdWidth)
#print("boardLength:\t",brdLength)

#output g-code header stuff
print("G21") # set coordinates to mm
print("G90") # set coordinate mode to absolute
print("M05") # turn off spindle
print("M03 S"+str(spindleSpeed))  # turn on spindle and set speed
print("")
X = -0.5*brdWidth+bevWidth
Y = -0.5*brdLength
Z = 0.0
print("G0 X"+str(X)+" Y"+str(Y)+" Z"+str(Z)) # go to front left edge of the board
bev = 0.0
while (bev<bevWidth):
      Y= 0.5*brdLength-(bevWidth-bev)    #up the left side
      print("G1 X"+str(X)+" Y"+str(Y)+" Z"+str(Z)+" F"+str(feedRate))
      X= 0.5*brdWidth-(bevWidth-bev)    # across the top
      print("G1 X"+str(X)+" Y"+str(Y)+" Z"+str(Z)+" F"+str(feedRate))
      Y=-0.5*brdLength                   #down the right side
      print("G1 X"+str(X)+" Y"+str(Y)+" Z"+str(Z)+" F"+str(feedRate))
      #step over and step down
      bev=bev+stepOver
      Z=depth(bev,bevWidth)

      #now go back the other way
      Y= 0.5*brdLength-(bevWidth-bev)    #up the right side
      print("G1 X"+str(X)+" Y"+str(Y)+" Z"+str(Z)+" F"+str(feedRate))
      X=-0.5*brdWidth+(bevWidth-bev)    # across the top
      print("G1 X"+str(X)+" Y"+str(Y)+" Z"+str(Z)+" F"+str(feedRate))
      Y=-0.5*brdLength                   #down the left side
      print("G1 X"+str(X)+" Y"+str(Y)+" Z"+str(Z)+" F"+str(feedRate))
      
      #step over and step down
      bev=bev+stepOver
      Z=depth(bev,bevWidth)
      
print("G0 Z15.0")       # raise the spindle
print("G0 X0.0 Y0.0")   # return to 0,0
print("M5")             # turn off the spindle
3 Likes