Skip to content

Instantly share code, notes, and snippets.

@tspspi
Created July 15, 2022 09:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tspspi/2d2d5370b54b66923c58a88cc51d1925 to your computer and use it in GitHub Desktop.
Save tspspi/2d2d5370b54b66923c58a88cc51d1925 to your computer and use it in GitHub Desktop.
Lasercutter test structure generator
import math
def gcodeRectangle(center, size, power, speedtravel, speedcut):
# Disable laser, travel to center
res = "M42 P4 S0\n"
res = res + "G00 X{0:4.2f} Y{1:4.2f} F{2}\n".format(center[0], center[1], speedtravel)
# Travel to first corner
res = res + "G00 X{0:4.2f} Y{1:4.2f} F{2}\n".format(center[0] - size[0]/2, center[1] -size[1]/2, speedtravel)
# Enable laser
res = res + "M42 P4 S{}\n".format(power)
# Travel around rectangle ...
res = res + "G01 X{0:4.2f} Y{1:4.2f} F{2}\n".format(center[0] + size[0]/2, center[1] - size[1]/2, speedcut)
res = res + "G01 X{0:4.2f} Y{1:4.2f} F{2}\n".format(center[0] + size[0]/2, center[1] + size[1]/2, speedcut)
res = res + "G01 X{0:4.2f} Y{1:4.2f} F{2}\n".format(center[0] - size[0]/2, center[1] + size[1]/2, speedcut)
res = res + "G01 X{0:4.2f} Y{1:4.2f} F{2}\n".format(center[0] - size[0]/2, center[1] - size[1]/2, speedcut)
# Disable laser
res = res + "M42 P4 S0\n"
return res
def gcodePowerRectangles(center, sizeMax, steps, powerMin, powerMax, speedtravel, speedcut, nPasses = 1):
stepSize = sizeMax / steps
powerStep = (powerMax - powerMin) / steps
res = ""
for iRect in range(steps):
curSize = [ stepSize * (iRect + 1), stepSize * (iRect + 1) ]
curPower = math.floor(powerMin + iRect * (powerStep+1))
res = res + gcodeRectangle(center, curSize, curPower, speedtravel, speedcut)
if nPasses > 1:
res2 = ""
for iPass in range(nPasses):
res2 = res2 + res
return res2
else:
return res
def gcodePassPowerRectangles(areaX, areaY, passes, powersteps, powerMin, powerMax, speedtravel, speedcut):
# First determine size of our rectangles (by fitting into the work area)...
tryX = min(areaX, areaY)
while True:
nx = math.floor(areaX / tryX)
ny = math.floor(areaY / tryX)
nmax = nx * ny
if nmax >= len(passes):
break
tryX = tryX - 1.0
if tryX < 10.0:
print("Cannot fit into work area in a useful way ...")
sys.exit(0)
print("; Size of single object: {}".format(tryX))
sizeMax = tryX
curX = -tryX/2.0
curY = tryX / 2.0
res = ""
for iStep in range(len(passes)):
curX = curX + tryX
if curX > areaX:
curX = tryX / 2.0
curY = curY + tryX
res = res + "; {} passes, center at ({}, {})\n".format(passes[iStep], curX, curY)
res = res + gcodePowerRectangles([curX, curY], sizeMax, powersteps, powerMin, powerMax, speedtravel, speedcut, nPasses = passes[iStep])
res = res + "G00 X0 Y0 F{0}\n".format(speedtravel)
print(res)
gcodePassPowerRectangles(100, 100, [ 1, 10, 25, 50, 75, 100 ], 10, 25, 255, 3000, 300)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment