-
-
Save tspspi/2d2d5370b54b66923c58a88cc51d1925 to your computer and use it in GitHub Desktop.
Lasercutter test structure generator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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