Code now supports python3 too

pull/6/head
Carlos Garcia Saura 2013-07-28 13:57:16 -07:00
parent 8dcdf1f4ae
commit 52b4e99833
17 changed files with 244 additions and 245 deletions

View File

@ -58,7 +58,7 @@ grid_len_X += N_copies_X*margin_copies_X
grid_len_Y *= N_copies_Y
grid_len_Y += N_copies_Y*margin_copies_Y
print "PANELIZING: There will be",str(N_copies_X)+"x"+str(N_copies_Y),"copies of this board"
print("PANELIZING: There will be " + str(N_copies_X)+"x"+str(N_copies_Y) + " copies of this board")
Z_probing_data['grid_len'] = (grid_len_X,grid_len_Y)
@ -67,5 +67,6 @@ saveToFile(Z_probing_data,Z_PROBING_FILE)
pltRefresh(gcodeviewer) # Draw the figure contents, still no window
pltShow() # Open the window showing our figure
raw_input("Press enter to exit...")
print("Press enter to exit...")
val = sys.stdin.readline()

View File

@ -47,7 +47,7 @@ grid_len = Z_probing_data['grid_len']
cy.moveZrelSafe(initial_Z_lowering_distance,F_slowMove) # Move Z towards the PCB (saves some probing time for the first coord)
# Do the probing itself
(x_points, y_points, probe_result, Z_offset, probe_duration) = cy.probeGrid(grid_origin, grid_len, GRID_N_POINTS, Zlift)
(x_points, y_points, probe_result, Z_offset, probe_duration) = cy.probeGrid(grid_origin, grid_len, GRID_N_POINTS, Zlift, F_fastMove, F_slowMove)
#x_points = [0.0, 17.5, 35.0, 52.5, 70.0]
#y_points = [0.0, 13.333333333333334, 26.666666666666668, 40.0]
@ -62,12 +62,12 @@ Z_probing_data['probe_duration'] = probe_duration
saveToFile(Z_probing_data,Z_PROBING_FILE)
# Show our grid
print "#-------- Probing results ---------"
print "x_points = ", x_points
print "y_points = ", y_points
print "probe_result = ", probe_result
print "probe_duration = ", probe_duration
print "#--------------------------------------"
print("#-------- Probing results ---------")
print("x_points = " + str(x_points) )
print("y_points = " + str(y_points) )
print("probe_result = " + str(probe_result) )
print("probe_duration = " + str(probe_duration) )
print("#--------------------------------------")
# Display values
@ -89,10 +89,10 @@ pltShowNonBlocking()
Z_workbed_surface = interpolate.RectBivariateSpline(y_points, x_points, probe_result)
# Evaluate the interpolation in a 50x50 grid for display
x_points = np.linspace(min(x_points),max(x_points),50)
y_points = np.linspace(min(y_points),max(y_points),50)
x_points = np.linspace(min(x_points),max(x_points),100)
y_points = np.linspace(min(y_points),max(y_points),100)
z_points = Z_workbed_surface(y_points,x_points)
#print z_points
#print( str(z_points) )
plt.figure()
plt.pcolor(x_points, y_points, z_points)
@ -103,5 +103,6 @@ pltShowNonBlocking()
cy.close() # Close the connection with Cyclone
raw_input("Press enter to exit...")
print("Press enter to exit...")
val = sys.stdin.readline()

View File

@ -74,7 +74,7 @@ gcodeviewer = pltNewFig() # Define a new figure, this doesnt open a window by it
# Load the probing results (this will plot the copper level in the background too)
probingResults()
#print "Must be zero, otherwise the interpolation is wrong!:",floats(getZoffset(0,0))
#print("Must be zero, otherwise the interpolation is wrong!: " + floats(getZoffset(0,0)))
# Display the Gcode that is going to be etched
(etch_moves, travel_moves, gcode_minXY, gcode_maxXY) = gcv.view(filePath,fileName,0,showEtch,showEtch,showEtch2,showDrill,showEdge)
@ -86,9 +86,9 @@ probingResults()
(boardSizeX,boardSizeY,gcode_minXY_global, gcode_maxXY_global) = gcv.boardSize(filePath,fileName)
# Show delimiter rectangle
x_dat = [gcode_minXY_global[0],gcode_minXY_global[0],gcode_maxXY_global[0],gcode_maxXY_global[0],gcode_minXY_global[0]]
y_dat = [gcode_minXY_global[1],gcode_maxXY_global[1],gcode_maxXY_global[1],gcode_minXY_global[1],gcode_minXY_global[1]]
plt.plot(x_dat,y_dat)
#x_dat = [gcode_minXY_global[0],gcode_minXY_global[0],gcode_maxXY_global[0],gcode_maxXY_global[0],gcode_minXY_global[0]]
#y_dat = [gcode_minXY_global[1],gcode_maxXY_global[1],gcode_maxXY_global[1],gcode_minXY_global[1],gcode_minXY_global[1]]
#plt.plot(x_dat,y_dat)
pltRefresh(gcodeviewer) # Draw the figure contents, still no window
pltShow() # Open the window showing our figure
@ -140,7 +140,7 @@ initial_Z_lowering_distance = -10
cy.moveZrelSafe(initial_Z_lowering_distance,F_slowMove) # Move Z towards the PCB (saves some probing time for the first coord)
Z_origin_offset = cy.probeZ()
print "Z offset:", Z_origin_offset
print("Z offset: " + str(Z_origin_offset) )
toolPos_X = 0
@ -170,9 +170,9 @@ def splitLongEtchMove(distance):
#distance = distance**0.5 # [mm]
N_steps = int((distance/maxDistance)**0.5) # **must be** >= 1
print "Splitting", distance**0.5, "mm segment into", N_steps, "steps"
print("Splitting " + str(distance**0.5) + "mm segment into " + str(N_steps) + " steps")
# print "Orig:", toolPos_X, toolPos_Y, toolPos_Z, "Dest:", X_dest, Y_dest, Z_dest
# print("Orig: " + (toolPos_X,toolPos_Y,toolPos_Z) + " Dest: " + (X_dest, Y_dest, Z_dest))
X_step = (X_dest-toolPos_X)/float(N_steps)
Y_step = (Y_dest-toolPos_Y)/float(N_steps)
@ -189,7 +189,7 @@ def splitLongEtchMove(distance):
cy.moveXYZ(X_dest_tmp, Y_dest_tmp, Z_real, F_dest_tmp)
toolPos_refresh(X_dest_tmp, Y_dest_tmp, etching=1)
# print "Move:",X_dest_tmp, Y_dest_tmp, Z_dest_tmp
# print("Move: " + (X_dest_tmp, Y_dest_tmp, Z_dest_tmp) )
toolPos_X = X_dest_tmp
toolPos_Y = Y_dest_tmp
@ -197,7 +197,8 @@ def splitLongEtchMove(distance):
toolPos_F = F_dest_tmp
raw_input("Turn on the spindle and press enter to begin...")
print("Turn on the spindle and press enter to begin...")
val = sys.stdin.readline()
def doPath(X_offset=0, Y_offset=0):
global toolPos_X, toolPos_Y, toolPos_Z, toolPos_F, X_dest, Y_dest, Z_dest, F_dest
@ -208,7 +209,7 @@ def doPath(X_offset=0, Y_offset=0):
X_dest = path[0][0]+X_offset
Y_dest = path[0][1]+Y_offset
F_dest = F_fastMove
print " Traveling to:", str([X_dest, Y_dest]), "at Z:", Z_global_offset+Zlift_milling
print(" Traveling to: " + str([X_dest, Y_dest]) + " at Z:" + str(Z_global_offset+Zlift_milling) )
cy.moveXY(X_dest, Y_dest, F_dest)
toolPos_draw(X_dest, Y_dest, etching=0)
Z_dest = path[0][2]
@ -217,14 +218,14 @@ def doPath(X_offset=0, Y_offset=0):
else:
F_dest = path[0][3] # We set the original speed if it is etching/drill
cy.moveZ(Z_dest+Z_origin_offset+getZoffset(X_dest, Y_dest)+Z_global_offset,F_dest)
# print "Speed:",F_dest
print " Etching at Z:",Z_dest+Z_global_offset
# print("Speed:",F_dest)
print(" Etching at Z: " + str(Z_dest+Z_global_offset) )
toolPos_X = X_dest
toolPos_Y = Y_dest
toolPos_Z = Z_dest # Not sure..
toolPos_F = F_dest
# print path
# print(path)
for coord in path[1:] :
X_dest = coord[0]+X_offset
@ -236,11 +237,11 @@ def doPath(X_offset=0, Y_offset=0):
if distance >= maxDistance :
splitLongEtchMove(distance)
if distance < minDistance and (Z_dest-toolPos_Z)**2 < 0.001**2 : # Make sure it is not a Z movement
print "Ignoring", distance**0.5, "mm segment!"
print("Ignoring " + str(distance**0.5) + "mm segment!")
continue
Z_real = Z_dest+Z_origin_offset+getZoffset(X_dest, Y_dest)+Z_global_offset
cy.moveXYZ(X_dest, Y_dest, Z_real, F_dest)
# print "Coords: Speed:",F_dest
# print("Coords: Speed: " + str(F_dest))
toolPos_refresh(X_dest, Y_dest, etching=1)
toolPos_X = X_dest
@ -256,5 +257,6 @@ for x_i in range(N_copies_X):
cy.homeZXY() # It is important to send a blocking command in the end
cy.close() # Close the connection with Cyclone
raw_input("Done. Press enter to exit...")
print("Done. Press enter to exit...")
val = sys.stdin.readline()

View File

@ -58,31 +58,31 @@ plt.hold(True)
plt.title("Original Gcode")
plt.axis('equal') # 1:1 aspect ratio
print "\n Loading etch..."
print("\n Loading etch...")
gcode_file = filePath+fileName+"_etch.gcode"
(etch_moves, travel_moves, gcode_originXY, grid_sizeXY) = gcp.parseGcodeRaw(gcode_file)
plotPoints(etch_moves, etch_color, etch_diam)
plotPoints(travel_moves, travel_color, linewidth_travel_move)
print "\n Loading etch (2nd pass)..."
print("\n Loading etch (2nd pass)...")
gcode_file = filePath+fileName+"_etch2pass.gcode"
(etch_moves, travel_moves, gcode_originXY, grid_sizeXY) = gcp.parseGcodeRaw(gcode_file)
plotPoints(etch_moves, etch2pass_color, etch2pass_diam)
plotPoints(travel_moves, travel_color, linewidth_travel_move)
print "\n Loading etch (3nd pass)..."
print("\n Loading etch (3nd pass)...")
gcode_file = filePath+fileName+"_etch3pass.gcode"
(etch_moves, travel_moves, gcode_originXY, grid_sizeXY) = gcp.parseGcodeRaw(gcode_file)
plotPoints(etch_moves, etch3pass_color, etch3pass_diam)
plotPoints(travel_moves, travel_color, linewidth_travel_move)
print "\n Loading drill..."
print("\n Loading drill...")
gcode_file = filePath+fileName+"_drill.gcode"
(etch_moves, travel_moves, gcode_originXY, grid_sizeXY) = gcp.parseGcodeRaw(gcode_file)
plotPoints(etch_moves, drill_color, drill_diam)
plotPoints(travel_moves, travel_color, linewidth_travel_move)
print "\n Loading edge..."
print("\n Loading edge...")
gcode_file = filePath+fileName+"_edge.gcode"
(etch_moves, travel_moves, gcode_originXY, grid_sizeXY) = gcp.parseGcodeRaw(gcode_file)
plotPoints(etch_moves, edge_color, edge_diam)
@ -95,35 +95,35 @@ plt.hold(True)
plt.title("Optimized (closest neighbour)")
plt.axis('equal') # 1:1 aspect ratio
print "\n Loading etch..."
print("\n Loading etch...")
gcode_file = filePath+fileName+"_etch.gcode"
(etch_moves, travel_moves, gcode_originXY, grid_sizeXY) = gcp.parseGcodeRaw(gcode_file)
(etch_moves, travel_moves) = gcp.optimize(etch_moves)
plotPoints(etch_moves, etch_color, etch_diam)
plotPoints(travel_moves, travel_color, linewidth_travel_move)
print "\n Loading etch (2nd pass)..."
print("\n Loading etch (2nd pass)...")
gcode_file = filePath+fileName+"_etch2pass.gcode"
(etch_moves, travel_moves, gcode_originXY, grid_sizeXY) = gcp.parseGcodeRaw(gcode_file)
(etch_moves, travel_moves) = gcp.optimize(etch_moves)
plotPoints(etch_moves, etch2pass_color, etch2pass_diam)
plotPoints(travel_moves, travel_color, linewidth_travel_move)
print "\n Loading etch (3nd pass)..."
print("\n Loading etch (3nd pass)...")
gcode_file = filePath+fileName+"_etch3pass.gcode"
(etch_moves, travel_moves, gcode_originXY, grid_sizeXY) = gcp.parseGcodeRaw(gcode_file)
(etch_moves, travel_moves) = gcp.optimize(etch_moves)
plotPoints(etch_moves, etch3pass_color, etch3pass_diam)
plotPoints(travel_moves, travel_color, linewidth_travel_move)
print "\n Loading drill..."
print("\n Loading drill...")
gcode_file = filePath+fileName+"_drill.gcode"
(etch_moves, travel_moves, gcode_originXY, grid_sizeXY) = gcp.parseGcodeRaw(gcode_file)
(etch_moves, travel_moves) = gcp.optimize(etch_moves)
plotPoints(etch_moves, drill_color, drill_diam)
plotPoints(travel_moves, travel_color, linewidth_travel_move)
print "\n Loading edge..."
print("\n Loading edge...")
gcode_file = filePath+fileName+"_edge.gcode"
(etch_moves, travel_moves, gcode_originXY, grid_sizeXY) = gcp.parseGcodeRaw(gcode_file)
(etch_moves, travel_moves) = gcp.optimize(etch_moves)
@ -134,5 +134,6 @@ plotPoints(travel_moves, travel_color, linewidth_travel_move)
plt.ion() # Enable real-time plotting to avoid blocking behaviour for pyplot
plt.show()
raw_input("Press enter to exit...")
print("Press enter to exit...")
val = sys.stdin.readline()

View File

@ -38,7 +38,7 @@ from datetime import datetime
import random
from helper import *
from CycloneHost.helper import *
# End modules
# Begin configuration. It is overwritten when running setup(baudrate, device)
@ -60,39 +60,39 @@ def connect(baudrate, device, emulate = 0):
global CNC_Machine, Emulate
BAUDRATE = baudrate
DEVICE = device
print "Connecting to Cyclone..."
print("Connecting to Cyclone...")
if emulate == 0:
CNC_Machine = serial.Serial(DEVICE, BAUDRATE, timeout = serial_timeout)
Emulate = 0
else:
Emulate = 1
print "EMULATING MACHINE!"
print "Serial port opened, checking connection..."
print("EMULATING MACHINE!")
print("Serial port opened, checking connection...")
time.sleep(2)
checkConnection()
print "Connected!"
print("Connected!")
def flushRecvBuffer(): # We could also use flushInput(), but showing the data that is being discarded is useful for debugging
if Emulate:
return
while CNC_Machine.inWaiting() > 0:
response = CNC_Machine.readline()
# if response != '': print "IGNO: ", response
# if response != '': print("IGNO: " + response)
time.sleep(seconds_wait) # Wait some milliseconds between attempts
def sendLine(line):
if Emulate == 0:
flushRecvBuffer()
CNC_Machine.write(line)
# print "SENT: ", line
# print("SENT: " + line)
def recvLine():
if Emulate:
response = "ok\n" # Asume OK
else:
response = CNC_Machine.readline()
# if response != '': print "RECV: ", response
# else: print "RECV: Receive timed out!"
# if response != '': print("RECV: " + response)
# else: print("RECV: Receive timed out!")
return response
def recvOK():
@ -102,19 +102,19 @@ def recvOK():
return 0
def waitForOK(command="",timeoutResend=30): # This is a blocking function
# print "Waiting for confirmation"
# print("Waiting for confirmation")
i = 0
cmnd = command[:3].lower()
timeoutResend = float(timeoutResend)
#timeoutResend = 5.0 # Resend command every 5 seconds, error recovery
#if cmnd == "g28": timeoutResend = 60.0 # Homing moves will take more than 5 seconds
i_timeout = int(timeoutResend/float(serial_timeout+seconds_wait))
# print "i_timeout",i_timeout
# print("i_timeout = " + str(i_timeout))
while recvOK() != 1:
print " Checking again... timeout:",i_timeout
print(" Checking again... timeout: " + str(i_timeout) )
time.sleep(seconds_wait) # Wait some milliseconds between attempts
if cmnd != "g30" and i >= i_timeout: # WARNING: Commands that take >5s may have problems here!
print " WATCHOUT! RESENDING:",command
print(" WATCHOUT! RESENDING: " + str(command) )
sendLine(command)
i = 0
else:
@ -125,7 +125,7 @@ def sendCommand(command,timeoutResend=15): # Send command and wait for OK
waitForOK(command,timeoutResend)
def checkConnection():
# print "Checking the connection..."
# print("Checking the connection...")
sendLine("G21\n") # We check the connection setting millimiters as the unit and waiting for the OK response
time.sleep(0.5)
while recvOK() != 1:
@ -134,7 +134,7 @@ def checkConnection():
def homeZXY():
global lastDrillPos
print "Homing all axis..."
print("Homing all axis...")
timeoutResend=30
sendCommand("G28 Z0\n",timeoutResend) # move Z to min endstop
sendCommand("G28 X0\n",timeoutResend) # move X to min endstop
@ -142,13 +142,13 @@ def homeZXY():
if Emulate:
time.sleep(2)
lastDrillPos = [0,0,0]
print "Done homing"
print("Done homing")
def moveXYZ(X, Y, Z, F):
global lastDrillPos
# print "Moving to:"
# print("Moving to:")
if F <= 0:
print "ERROR: F <= 0"
print("ERROR: F <= 0")
sendCommand("G1 X"+floats(X)+" Y"+floats(Y)+" Z"+floats(Z)+" F"+floats(F)+"\n")
if Emulate:
dist = ((X-lastDrillPos[0])**2+(Y-lastDrillPos[1])**2+(Z-lastDrillPos[2])**2)**0.5 # [mm]
@ -158,9 +158,9 @@ def moveXYZ(X, Y, Z, F):
def moveXY(X, Y, F):
global lastDrillPos
# print "Moving to:"
# print("Moving to:")
if F <= 0:
print "ERROR: F <= 0"
print("ERROR: F <= 0")
sendCommand("G1 X"+floats(X)+" Y"+floats(Y)+" F"+floats(F)+"\n")
if Emulate:
dist = ((X-lastDrillPos[0])**2+(Y-lastDrillPos[1])**2)**0.5 # [mm]
@ -170,9 +170,9 @@ def moveXY(X, Y, F):
def moveZ(Z, F):
global lastDrillPos
# print "Moving Z absolute:"
# print("Moving Z absolute:")
if F <= 0:
print "ERROR: F <= 0"
print("ERROR: F <= 0")
sendCommand("G1 Z"+floats(Z)+" F"+floats(F)+"\n")
if Emulate:
dist = abs(Z-lastDrillPos[2]) # [mm]
@ -182,9 +182,9 @@ def moveZ(Z, F):
def moveZrel(Z, F):
global lastDrillPos
# print "Moving Z relative:"
# print("Moving Z relative:")
if F <= 0:
print "ERROR: F <= 0"
print("ERROR: F <= 0")
sendCommand("G91\n") # Set relative positioning
sendCommand("G1 Z"+floats(Z)+" F"+floats(F)+"\n")
if Emulate:
@ -196,23 +196,23 @@ def moveZrel(Z, F):
def moveZrelSafe(Z, F):
if F <= 0:
print "ERROR: F <= 0"
print "Moving Z", Z, "mm safely..."
print("ERROR: F <= 0")
print("Moving Z " + str(Z) + "mm safely...")
sendCommand("M121\n") # Enable endstops (for protection! usually it should **NOT** hit neither the endstop nor the PCB)
moveZrel(Z, F)
dist = abs(Z) # [mm]
speed = float(F)/60.0 # [mm/s]
wait = float(dist)/speed # [s]
time.sleep(wait) # Wait for the movement to finish, this way the M121 command is effective
print " Done moving Z!"
print(" Done moving Z!")
sendCommand("M120\n") # Disable endstops (we only use them for homing)
def probeZ():
print "Probing Z"
print("Probing Z")
sendLine("G30\n") # Launch probe command
response = recvLine() # Read the response, it is a variable run time so we may need to make multiple attempts
while response == '':
#print "."
#print(".")
time.sleep(seconds_wait) # Wait some milliseconds between attempts
response = recvLine()
if Emulate:
@ -220,7 +220,7 @@ def probeZ():
response_vals = response.split() # Split the response (i.e. "ok Z1.23")
if response_vals[0][:2].lower() == OK_response.lower():
Zres = response_vals[1][2:] # Ignore the "Z:" and read the coordinate value
print "Result is Z=",Zres
print("Result is Z = " + str(Zres))
return float(Zres)
return 400 # Error case, don't worry: it has never happened :)
@ -230,7 +230,7 @@ def close():
if Emulate == 0:
CNC_Machine.close() # Close the serial port connection
def probeGrid(grid_origin, grid_len, grid_N, Zlift, F_fastMove = 400, F_slowMove = 100):
def probeGrid(grid_origin, grid_len, grid_N, Zlift, F_fastMove, F_slowMove):
grid_origin_X = float(grid_origin[0]) # Initial point of the grid [mm]
grid_origin_Y = float(grid_origin[1])
@ -252,10 +252,10 @@ def probeGrid(grid_origin, grid_len, grid_N, Zlift, F_fastMove = 400, F_slowMove
# Show our grid (initialised as zeros)
for row in probe_result:
print row
print(str(row))
print "Probing begins!"
print "WARNING: Keep an eye on the machine, unplug if something goes wrong!"
print("Probing begins!")
print("WARNING: Keep an eye on the machine, unplug if something goes wrong!")
beginTime = datetime.now() # Store current time in a variable, will be used to measure duration of the probing
# Move to grid's origin
@ -274,7 +274,7 @@ def probeGrid(grid_origin, grid_len, grid_N, Zlift, F_fastMove = 400, F_slowMove
# Once we have all the points, we set the origin as (0,0) and offset the rest of values
Z_offset = probe_result[0][0]
print "The origin Z height is", Z_offset
print("The origin Z height is " + str(Z_offset))
probe_result = [[elem - Z_offset for elem in row] for row in probe_result]
# Return to the grid's origin
@ -282,7 +282,7 @@ def probeGrid(grid_origin, grid_len, grid_N, Zlift, F_fastMove = 400, F_slowMove
moveXY(grid_origin_X, grid_origin_Y, F_fastMove) # Move to grid's origin
duration = datetime.now() - beginTime
print "Probing duration:", str(duration)
print("Probing duration:" + str(duration))
duration_s = duration.total_seconds()
return (x_points, y_points, probe_result, Z_offset, duration_s)

View File

@ -84,7 +84,7 @@ def parseGcodeRaw(filePath, etch_definition = 0, close_shapes = 0): # Gcode pars
totalLines = len(lines)
for line in lines:# check each line
currentLine = currentLine + 1
#print "({0:.1f}%)".format((currentLine / totalLines)*100), "Reading:", line[:-1]
#print("({0:.1f}%)".format((currentLine / totalLines)*100), "Reading:", line[:-1])
X_start = X_dest
Y_start = Y_dest
@ -155,11 +155,11 @@ def parseGcodeRaw(filePath, etch_definition = 0, close_shapes = 0): # Gcode pars
gcode_maxXY = [X_max, Y_max]
gcode_minXY = [X_min, Y_min]
print "Gcode XY min:",str(gcode_minXY)
print "Gcode XY max:",str(gcode_maxXY)
print("Gcode XY min: " + str(gcode_minXY))
print("Gcode XY max: " + str(gcode_maxXY))
else :
print "No etch moves found!"
print("No etch moves found!")
return etch_moves, travel_moves, [0,0], [0,0]
gcode.close()
return etch_moves, travel_moves, gcode_minXY, gcode_maxXY
@ -179,7 +179,7 @@ def optimize(etch_moves_in, origin=[0,0], travel_height = 5): # Optimizes the to
minDistance = 1e9
while len(etch_moves_in) > 0 : # While there are remaining moves
closest = [1e9,1e9]
closest = 1e9
distance = 1e9
closestMove_i = 0
i = 0
@ -197,13 +197,13 @@ def optimize(etch_moves_in, origin=[0,0], travel_height = 5): # Optimizes the to
closest = distance
closestMove_i = i
reverse = 1 # Flag set to reverse the path
#print "Using a reverse path did optimize!"
#print("Using a reverse path did optimize!")
i = i + 1
path = etch_moves_in[closestMove_i] # Select the closest that has been found
if reverse :
path = path[::-1] # If the closest one was from the end, we reverse the path
#print "Reverse!"
#print("Reverse!")
firstPoint = path[0]
@ -211,7 +211,7 @@ def optimize(etch_moves_in, origin=[0,0], travel_height = 5): # Optimizes the to
travel_moves.append([toolPosition, [firstPoint[0], firstPoint[1], travel_height, firstPoint[3]] ]) # Travel to the initial point of the etching
else :
travel_moves.append([toolPosition, firstPoint]) # Travel to the initial point of the etching (without lifting)
print "Joining etching paths!" # TODO: This needs to join also the paths in etch_moves! otherwise it makes no difference!
print("Joining etching paths!") # TODO: This needs to join also the paths in etch_moves! otherwise it makes no difference!
if distance < minDistance :
minDistance = distance
@ -221,7 +221,7 @@ def optimize(etch_moves_in, origin=[0,0], travel_height = 5): # Optimizes the to
toolPosition = path[-1] # Set our endpoint as the initial one for the next move
print "Minimum XY travel distance:", minDistance**0.5
print("Minimum XY travel distance: " + str(minDistance**0.5) )
travel_moves.append([toolPosition, [origin[0], origin[1], travel_height, 10]]) # Return to the origin
return etch_moves, travel_moves

View File

@ -18,7 +18,7 @@ import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
import GcodeParser as gcp
import CycloneHost.GcodeParser as gcp
# End modules
def plotPoints(path_list, color, linewidth): # Thanks to pprzemek (http://stackoverflow.com/questions/2282727/draw-points-using-matplotlib-pyplot-x1-y1-x2-y2)
@ -85,7 +85,7 @@ def view(filePath,fileName,showAll=0,showEtch=0,showEtch2=0,showEtch3=0,showDril
plt.hold(True)
if showAll or showEtch:
print "\n Loading etch..."
print("\n Loading etch...")
gcode_file = filePath+fileName+"_etch.gcode"
(etch_moves, travel_moves, gcode_minXY, gcode_maxXY) = gcp.parseGcodeRaw(gcode_file)
(etch_moves, travel_moves) = gcp.optimize(etch_moves)
@ -93,7 +93,7 @@ def view(filePath,fileName,showAll=0,showEtch=0,showEtch2=0,showEtch3=0,showDril
checkMinMax(gcode_minXY,gcode_maxXY)
if showAll or showEtch2:
print "\n Loading etch (2nd pass)..."
print("\n Loading etch (2nd pass)...")
gcode_file = filePath+fileName+"_etch2pass.gcode"
(etch_moves, travel_moves, gcode_minXY, gcode_maxXY) = gcp.parseGcodeRaw(gcode_file)
(etch_moves, travel_moves) = gcp.optimize(etch_moves)
@ -101,7 +101,7 @@ def view(filePath,fileName,showAll=0,showEtch=0,showEtch2=0,showEtch3=0,showDril
checkMinMax(gcode_minXY,gcode_maxXY)
if showAll or showEtch3:
print "\n Loading etch (3rd pass)..."
print("\n Loading etch (3rd pass)...")
gcode_file = filePath+fileName+"_etch3pass.gcode"
(etch_moves, travel_moves, gcode_minXY, gcode_maxXY) = gcp.parseGcodeRaw(gcode_file)
(etch_moves, travel_moves) = gcp.optimize(etch_moves)
@ -109,7 +109,7 @@ def view(filePath,fileName,showAll=0,showEtch=0,showEtch2=0,showEtch3=0,showDril
checkMinMax(gcode_minXY,gcode_maxXY)
if showAll or showDrill:
print "\n Loading drill..."
print("\n Loading drill...")
gcode_file = filePath+fileName+"_drill.gcode"
(etch_moves, travel_moves, gcode_minXY, gcode_maxXY) = gcp.parseGcodeRaw(gcode_file)
(etch_moves, travel_moves) = gcp.optimize(etch_moves)
@ -117,7 +117,7 @@ def view(filePath,fileName,showAll=0,showEtch=0,showEtch2=0,showEtch3=0,showDril
checkMinMax(gcode_minXY,gcode_maxXY)
if showAll or showEdge:
print "\n Loading edge..."
print("\n Loading edge...")
gcode_file = filePath+fileName+"_edge.gcode"
(etch_moves, travel_moves, gcode_minXY, gcode_maxXY) = gcp.parseGcodeRaw(gcode_file)
(etch_moves, travel_moves) = gcp.optimize(etch_moves)

View File

@ -35,7 +35,7 @@ class LINE:
self.inside = inside
self.delete = delete
def merge_lines(gGCODES):
print "merge lines ..."
print("merge lines ...")
i = 0
while i< len(gGCODES)-1:
if(gGCODES[i].gtype <= 2):
@ -62,7 +62,7 @@ def merge_lines(gGCODES):
a1 = (dy1)/(dx1)
b1 = gGCODES[i].y1 - a1 * gGCODES[i].x1
j = i + 1
#print "i =",i,", j =",j
#print("i =",i,", j =",j
while j< len(gGCODES):
if(gGCODES[j].gtype <= 2):
j += 1
@ -150,19 +150,19 @@ def merge_lines(gGCODES):
gGCODES[i].gtype = 0
break
elif abs(gGCODES[i].y1 - gGCODES[j].y1) <= (w2/2 + w1/2):
#print w2/2 + w1/2, gGCODES[i].y1 - gGCODES[j].y1
#print(w2/2 + w1/2, gGCODES[i].y1 - gGCODES[j].y1
#
x2min = gGCODES[j].x1
x2max = gGCODES[j].x2
if(gGCODES[j].x2 < gGCODES[j].x1):
x2min = gGCODES[j].x2
x2max = gGCODES[j].x1
#print "near"
#print("near"
#if gGCODES[i].gtype == 4 and gGCODES[j].gtype == 4:
if abs((x1max-x1min) - (x2max-x2min)) < SMALL: #same length
#print "same"
#print("same"
if abs((x1max+x1min)/2 - (x2max+x2min)/2) < SMALL: #same center
#print "center"
#print("center"
tmp_ymin = gGCODES[i].y1 - w1/2
tmp_ymax = gGCODES[j].y1 + w2/2
if tmp_ymin > gGCODES[j].y1 - w2/2:
@ -345,7 +345,7 @@ def merge_lines(gGCODES):
return gGCODES
def check_duplication(gGCODES):
#global gGCODES,TINY
print "Check overlapping lines ..."
print("Check overlapping lines ...")
i = 0
while i< len(gGCODES)-1:
@ -413,11 +413,11 @@ def check_duplication(gGCODES):
aj=dyj/dxj
bj=yj1-aj*xj1
if(abs(aj-ai) < TINY and abs(bj-bi) < TINY):
#print "a=" + str(ai)
#print("a=" + str(ai)
if(xj_min>=xi_min):
#print "a"
#print("a"
if(xj_max<=xi_max):
#print "aa"
#print("aa"
#overlap
if(gGCODES[i].mod1 >= gGCODES[j].mod1):
gGCODES[j].gtype=0
@ -425,7 +425,7 @@ def check_duplication(gGCODES):
continue
elif(xi_max >= xj_min): # xj_max > xi_max
if(gGCODES[i].mod1 == gGCODES[j].mod1):
#print "ab i=" +str(i) + ", j=" + str(j)
#print("ab i=" +str(i) + ", j=" + str(j)
gGCODES[j].gtype=0
#gGCODES[i].x1 = xi_min
#gGCODES[i].y1 = gGCODES[i].y1
@ -440,18 +440,18 @@ def check_duplication(gGCODES):
#j += 1
#continue
elif(xj_min<=xi_min):
#print "b"
#print("b"
if(xj_max>=xi_max):
#print "ba"
#print("ba"
#overlap
if(gGCODES[i].mod1 <= gGCODES[j].mod1):
gGCODES[i].gtype=0
break
elif(xj_max >= xi_min): # xj_max < xi_max
if(gGCODES[i].mod1 == gGCODES[j].mod1):
#print "bb i=" +str(i) + ", j=" + str(j)
#print("bb i=" +str(i) + ", j=" + str(j)
gGCODES[j].gtype=0
#print "x1=" +str(gGCODES[i].x1) +", y1=" +str(gGCODES[i].y1) +", x2=" +str(gGCODES[i].x2) +", y2=" +str(gGCODES[i].y2)
#print("x1=" +str(gGCODES[i].x1) +", y1=" +str(gGCODES[i].y1) +", x2=" +str(gGCODES[i].x2) +", y2=" +str(gGCODES[i].y2)
#gGCODES[i].x2 = xi_max
#gGCODES[i].y2 = gGCODES[i].y2
#if(m_x1_flag): #if xi_max = gGCODES[i].x1
@ -465,7 +465,7 @@ def check_duplication(gGCODES):
if(xj1>xj2): #if xi_min = xj2
gGCODES[i].y1 = gGCODES[j].y2
xi_min = xj_min
#print "x1=" +str(gGCODES[i].x1) +", y1=" +str(gGCODES[i].y1) +", x2=" +str(gGCODES[i].x2) +", y2=" +str(gGCODES[i].y2)
#print("x1=" +str(gGCODES[i].x1) +", y1=" +str(gGCODES[i].y1) +", x2=" +str(gGCODES[i].x2) +", y2=" +str(gGCODES[i].y2)
#j += 1
#continue
else: #dxi==0
@ -512,11 +512,11 @@ def check_duplication(gGCODES):
else: #ti != tj
if(ti == 2):
if(tj == 3 or tj == 4):
#print "rect ti"
#print("rect ti"
if(gGCODES[j].x1 == gGCODES[j].x2 and gGCODES[i].x1 == gGCODES[j].x1): #Vertical
#print "ti check x"
#print("ti check x"
if(gGCODES[i].mod1 == gGCODES[j].mod1):
#print "ti check x mod1"
#print("ti check x mod1"
#line = [gGCODES[i].x1,gGCODES[i].y1-gGCODES[i].mod2/2,gGCODES[i].x1,gGCODES[i].y1+gGCODES[i].mod2/2]
x1=gGCODES[i].x1
y1=gGCODES[i].y1-gGCODES[i].mod2/2
@ -532,11 +532,11 @@ def check_duplication(gGCODES):
gGCODES[j].gtype=0
if(ovflag == 3):
gGCODES[i].gtype=0
print "ti overlap =" + str(ovflag)
#print line_joint(x1,y1,x2,y2,xa,ya,xb,yb,ovflag)
print("ti overlap =" + str(ovflag))
#print(line_joint(x1,y1,x2,y2,xa,ya,xb,yb,ovflag)
tx1,ty1,tx2,ty2=line_joint(x1,y1,x2,y2,xa,ya,xb,yb,ovflag)
if(tj == 4): #Rect
print "Rect-Rect"
print("Rect-Rect")
gGCODES[j].gtype = 0
gGCODES[i].gtype = 4
gGCODES[i].x1 = tx1
@ -544,7 +544,7 @@ def check_duplication(gGCODES):
gGCODES[i].x2 = tx2
gGCODES[i].y2 = ty2
elif(tj == 3):
print "rect-cir"
print("rect-cir")
gGCODES[j].gtype = 0
gGCODES[i].gtype = 5
gGCODES[i].mod1 =gGCODES[j].mod1
@ -558,9 +558,9 @@ def check_duplication(gGCODES):
gGCODES[i].x2 = tx1
gGCODES[i].y2 = ty1
if(gGCODES[j].y1 == gGCODES[j].y2 and gGCODES[i].y1 == gGCODES[j].y1): #Horizontal
#print "ti check y"
#print("ti check y"
if(gGCODES[i].mod2 == gGCODES[j].mod1):
#print "ti check y mod1"
#print("ti check y mod1"
#line = [gGCODES[i].x1-gGCODES[i].mod1/2,gGCODES[i].y1,gGCODES[i].x1+gGCODES[i].mod1/2,gGCODES[i].y1]
x1=gGCODES[i].x1-gGCODES[i].mod1/2
y1=gGCODES[i].y1
@ -576,11 +576,11 @@ def check_duplication(gGCODES):
gGCODES[j].gtype=0
if(ovflag == 7):
gGCODES[i].gtype=0
print "ti overlap =" + str(ovflag)
print("ti overlap =" + str(ovflag))
tx1,ty1,tx2,ty2=line_joint(x1,y1,x2,y2,xa,ya,xb,yb,ovflag)
if(tj == 4): #Rect
print "Rect-Rect"
print("Rect-Rect")
gGCODES[j].gtype = 0
gGCODES[i].gtype = 4
gGCODES[i].x1 = tx1
@ -588,7 +588,7 @@ def check_duplication(gGCODES):
gGCODES[i].x2 = tx2
gGCODES[i].y2 = ty2
elif(tj == 3):
print "rect-cir"
print("rect-cir")
gGCODES[j].gtype = 0
gGCODES[i].gtype = 5
gGCODES[i].mod1 =gGCODES[j].mod1
@ -603,11 +603,11 @@ def check_duplication(gGCODES):
gGCODES[i].y2 = ty1
if(tj == 2):
if(ti == 3 or ti == 4):
#print "rect tj"
#print("rect tj"
if(gGCODES[i].x1 == gGCODES[i].x2 and gGCODES[i].x1 == gGCODES[j].x1): #Vertical
#print "ti check x"
#print("ti check x"
if(gGCODES[i].mod1 == gGCODES[j].mod1):
#print "ti check x mod1"
#print("ti check x mod1"
#line = [gGCODES[i].x1,gGCODES[i].y1-gGCODES[i].mod2/2,gGCODES[i].x1,gGCODES[i].y1+gGCODES[i].mod2/2]
x1=gGCODES[j].x1
y1=gGCODES[j].y1-gGCODES[j].mod2/2
@ -623,11 +623,11 @@ def check_duplication(gGCODES):
gGCODES[j].gtype=0
if(ovflag == 3):
gGCODES[i].gtype=0
print "tj overlap =" + str(ovflag)
#print line_joint(x1,y1,x2,y2,xa,ya,xb,yb,ovflag)
print("tj overlap =" + str(ovflag))
#print(line_joint(x1,y1,x2,y2,xa,ya,xb,yb,ovflag)
tx1,ty1,tx2,ty2=line_joint(x1,y1,x2,y2,xa,ya,xb,yb,ovflag)
if(tj == 4): #Rect
print "Rect-Rect"
print("Rect-Rect")
gGCODES[j].gtype = 0
gGCODES[i].gtype = 4
gGCODES[i].x1 = tx1
@ -635,7 +635,7 @@ def check_duplication(gGCODES):
gGCODES[i].x2 = tx2
gGCODES[i].y2 = ty2
elif(tj == 3):
print "rect-cir"
print("rect-cir")
gGCODES[j].gtype = 0
gGCODES[i].gtype = 5
gGCODES[i].mod1 =gGCODES[j].mod1
@ -649,7 +649,7 @@ def check_duplication(gGCODES):
gGCODES[i].x2 = tx1
gGCODES[i].y2 = ty1
if(gGCODES[i].y1 == gGCODES[i].y2 and gGCODES[i].y1 == gGCODES[j].y1): #Horizontal
#print "ti check y"
#print("ti check y"
if(gGCODES[i].mod1 == gGCODES[j].mod2):
x1=gGCODES[j].x1-gGCODES[j].mod1/2
@ -666,11 +666,11 @@ def check_duplication(gGCODES):
gGCODES[j].gtype=0
if(ovflag == 7):
gGCODES[i].gtype=0
print "tj overlap =" + str(ovflag)
print("tj overlap =" + str(ovflag))
tx1,ty1,tx2,ty2=line_joint(x1,y1,x2,y2,xa,ya,xb,yb,ovflag)
if(tj == 4): #Rect
print "Rect-Rect"
print("Rect-Rect")
gGCODES[j].gtype = 0
gGCODES[i].gtype = 4
gGCODES[i].x1 = tx1
@ -678,7 +678,7 @@ def check_duplication(gGCODES):
gGCODES[i].x2 = tx2
gGCODES[i].y2 = ty2
elif(tj == 3):
print "rect-cir"
print("rect-cir")
gGCODES[j].gtype = 0
gGCODES[i].gtype = 5
gGCODES[i].mod1 =gGCODES[j].mod1
@ -826,7 +826,7 @@ def merge(gPOLYGONS, LINE, gLINES,gLINES2):
#del all polygons
poly3.delete = 1
gPOLYGONS = line_merge(gPOLYGONS, gLINES)
print "End merge polygons"
print("End merge polygons")
return gPOLYGONS
def line_merge(gPOLYGONS, gLINES):
@ -853,7 +853,7 @@ def line_merge(gPOLYGONS, gLINES):
def merge_polygons(gPOLYGONS):
#global gPOLYGONS
print " Start merge lines 2"
print(" Start merge lines 2")
for poly1 in gPOLYGONS:
if(poly1.delete):
continue
@ -878,7 +878,7 @@ def merge_polygons(gPOLYGONS):
def IsLineOverlap(x1,y1,x2,y2,xa,ya,xb,yb):
global TINY
#print "check overlap"
#print("check overlap"
dx1 = x2-x1
#dy1 = y2-y1
dx2 = xb-xa
@ -900,9 +900,9 @@ def IsLineOverlap(x1,y1,x2,y2,xa,ya,xb,yb):
if(abs(a1-a2) < TINY):
b1 = y1-a1*x1
b2 = ya-a2*xa
#print "same angle " + str(a1 )+ ", b1=" + str(b1)+ ", b2=" + str(b2) + ", b2-b1=" + str(abs(b2-b1)) +", y1=" +str(y1) + ", ya=" + str(ya)
#print("same angle " + str(a1 )+ ", b1=" + str(b1)+ ", b2=" + str(b2) + ", b2-b1=" + str(abs(b2-b1)) +", y1=" +str(y1) + ", ya=" + str(ya)
if(abs(b2-b1) < TINY): #Horizontal
#print "same b " + str(b1)
#print("same b " + str(b1)
if (xa - x1)*(xa - x2) <= 0 or (xb - x1)*(xb - x2):
return 1
return 0
@ -946,7 +946,7 @@ def CrossAndIn(line_id,spoints, gLINES, LINE):
#global gLINES, gCCOUNT1, gCCOUNT2,TEST_POINTS1,TEST_POINTS2
global gCCOUNT1, gCCOUNT2,TEST_POINTS1,TEST_POINTS2
#check in or out
#print line_id
#print(line_id
if(gLINES[line_id].inside):
return 0
xa = gLINES[line_id].x1
@ -973,7 +973,7 @@ def CrossAndIn(line_id,spoints, gLINES, LINE):
(cross_flag,cross_x,cross_y)=find_cross_point(xa,ya,xb,yb,xp1,yp1,xp2,yp2)
cross_num+=cross_flag
if(cross_flag):
#print "cross"
#print("cross"
cross_points.extend([cross_x,cross_y])
cross_nums.append(si)
@ -1029,9 +1029,9 @@ def CrossAndIn(line_id,spoints, gLINES, LINE):
if(cross_num>1):
cross_points = sort_points_by_dist(xa,ya,cross_points)
#print calc_dist(gLINES[line_id].x1,gLINES[line_id].y1,cross_points[0],cross_points[1])
#print(calc_dist(gLINES[line_id].x1,gLINES[line_id].y1,cross_points[0],cross_points[1])
if(calc_dist(gLINES[line_id].x1,gLINES[line_id].y1,cross_points[0],cross_points[1])<=0.0):
#print "the cross point is same as p1 in_flag1=" + str(in_flag1) + "in_flag2=" + str(in_flag2)
#print("the cross point is same as p1 in_flag1=" + str(in_flag1) + "in_flag2=" + str(in_flag2)
if(in_flag1 != in_flag2):
gLINES[line_id].inside = 1
else:
@ -1065,7 +1065,7 @@ def CrossAndIn(line_id,spoints, gLINES, LINE):
if(in_flag1 == in_flag2):
#in in
gLINES[line_id].inside=in_flag1
#print "in-in or Out-OUT:flag="+str(in_flag1)+ ", id=" +str(line_id)
#print("in-in or Out-OUT:flag="+str(in_flag1)+ ", id=" +str(line_id)
else:
#in out
if(ovflag <=0):

View File

@ -1,5 +1,5 @@
(Generated by ./pygerber2gcode_cui_MOD.py )
( 2013-07-28 02:00:01 )
( 2013-07-28 13:51:51 )
(Initialize)
(Start form here)

View File

@ -1,5 +1,5 @@
(Generated by ./pygerber2gcode_cui_MOD.py )
( 2013-07-28 02:00:01 )
( 2013-07-28 13:51:51 )
(Initialize)
(Start form here)

View File

@ -1,5 +1,5 @@
(Generated by ./pygerber2gcode_cui_MOD.py )
( 2013-07-28 02:00:01 )
( 2013-07-28 13:51:51 )
(Initialize)
(Start form here)

View File

@ -1,5 +1,5 @@
(Generated by ./pygerber2gcode_cui_MOD.py )
( 2013-07-28 02:00:01 )
( 2013-07-28 13:51:51 )
(Initialize)
(Start form here)

View File

@ -1,5 +1,5 @@
(Generated by ./pygerber2gcode_cui_MOD.py )
( 2013-07-28 02:00:01 )
( 2013-07-28 13:51:51 )
(Initialize)
(Start form here)

View File

@ -246,54 +246,54 @@ def main():
front_poly_3pass = []
back_poly_3pass = []
if FRONT_FILE:
#print "Front file =",FRONT_FILE
#print("Front file =",FRONT_FILE
front_gerber = read_Gerber(GERBER_DIR,FRONT_FILE)
#front_gerber = gm.merge_lines(front_gerber)
front_gerber = gm.check_duplication(front_gerber)
#print len(front_gerber)
#print(len(front_gerber)
front_poly = gerber2polygon(front_gerber)
#print len(front_poly)
#print(len(front_poly)
front_poly = gm.merge(front_poly, LINE, gLINES,gLINES2)
if abs(float(ROT_ANG)) > TINY:
front_poly = rot_poly(front_poly)
if MIRROR_FRONT:
front_poly = mirror_poly(front_poly)
print len(front_poly)
print(len(front_poly))
if TOOL_2PASS_D > 0:
print "Processing 2nd pass..."
print("Processing 2nd pass...")
PREV_TOOL_D = TOOL_D
TOOL_D = TOOL_2PASS_D # Set the thicker tool
#print "Front file =",FRONT_FILE
#print("Front file =",FRONT_FILE
front_gerber_2pass = read_Gerber(GERBER_DIR,FRONT_FILE)
#front_gerber = gm.merge_lines(front_gerber)
front_gerber_2pass = gm.check_duplication(front_gerber_2pass)
#print len(front_gerber)
#print(len(front_gerber)
front_poly_2pass = gerber2polygon(front_gerber_2pass)
#print len(front_poly)
#print(len(front_poly)
front_poly_2pass = gm.merge(front_poly_2pass, LINE, gLINES,gLINES2)
if abs(float(ROT_ANG)) > TINY:
front_poly_2pass = rot_poly(front_poly_2pass)
if MIRROR_FRONT:
front_poly_2pass = mirror_poly(front_poly_2pass)
print len(front_poly_2pass)
print(len(front_poly_2pass))
TOOL_D = PREV_TOOL_D
if TOOL_3PASS_D > 0:
print "Processing 3nd pass..."
print("Processing 3nd pass...")
PREV_TOOL_D = TOOL_D
TOOL_D = TOOL_3PASS_D # Set the thicker tool
#print "Front file =",FRONT_FILE
#print("Front file =",FRONT_FILE
front_gerber_3pass = read_Gerber(GERBER_DIR,FRONT_FILE)
#front_gerber = gm.merge_lines(front_gerber)
front_gerber_3pass = gm.check_duplication(front_gerber_3pass)
#print len(front_gerber)
#print(len(front_gerber)
front_poly_3pass = gerber2polygon(front_gerber_3pass)
#print len(front_poly)
#print(len(front_poly)
front_poly_3pass = gm.merge(front_poly_3pass, LINE, gLINES,gLINES2)
if abs(float(ROT_ANG)) > TINY:
front_poly_3pass = rot_poly(front_poly_3pass)
if MIRROR_FRONT:
front_poly_3pass = mirror_poly(front_poly_3pass)
print len(front_poly_3pass)
print(len(front_poly_3pass))
TOOL_D = PREV_TOOL_D
if BACK_FILE:
back_gerber = read_Gerber(GERBER_DIR,BACK_FILE)
@ -305,9 +305,9 @@ def main():
back_poly = rot_poly(back_poly)
if MIRROR_BACK:
back_poly = mirror_poly(back_poly)
print len(back_poly)
print(len(back_poly))
if TOOL_2PASS_D > 0:
print "Processing 2nd pass..."
print("Processing 2nd pass...")
PREV_TOOL_D = TOOL_D
TOOL_D = TOOL_2PASS_D # Set the thicker tool
back_gerber_2pass = read_Gerber(GERBER_DIR,BACK_FILE)
@ -319,10 +319,10 @@ def main():
back_poly_2pass = rot_poly(back_poly_2pass)
if MIRROR_BACK:
back_poly_2pass = mirror_poly(back_poly_2pass)
print len(back_poly_2pass)
print(len(back_poly_2pass))
TOOL_D = PREV_TOOL_D
if TOOL_3PASS_D > 0:
print "Processing 3nd pass..."
print("Processing 3nd pass...")
PREV_TOOL_D = TOOL_D
TOOL_D = TOOL_3PASS_D # Set the thicker tool
back_gerber_3pass = read_Gerber(GERBER_DIR,BACK_FILE)
@ -334,7 +334,7 @@ def main():
back_poly_3pass = rot_poly(back_poly_3pass)
if MIRROR_BACK:
back_poly_3pass = mirror_poly(back_poly_3pass)
print len(back_poly_3pass)
print(len(back_poly_3pass))
TOOL_D = PREV_TOOL_D
if DRILL_FILE:
read_Drill_file(GERBER_DIR,DRILL_FILE)
@ -353,22 +353,18 @@ def read_config(config_file):
global INI_X, INI_Y, INI_Z, MOVE_HEIGHT, OUT_INCH_FLAG, IN_INCH_FLAG, MCODE_FLAG, XY_SPEED, Z_SPEED, LEFT_X, LOWER_Y, DRILL_SPEED, DRILL_DEPTH, CUT_DEPTH, TOOL_D, TOOL_2PASS_D, TOOL_3PASS_D, DRILL_D, CAD_UNIT, EDGE_TOOL_D, EDGE_DEPTH, EDGE_SPEED, EDGE_Z_SPEED, MERGE_DRILL_DATA, Z_STEP_DRILL, Z_STEP_EDGE, GERBER_COLOR, DRILL_COLOR, EDGE_COLOR , CONTOUR_COLOR, GERBER_EXT, DRILL_EXT, EDGE_EXT, GCODE_EXT, GDRILL_EXT, GEDGE_EXT, DRILL_UNIT, EDGE_UNIT, CUT_FLAG, CUT_OV
global GERBER_DIR,FRONT_FILE,BACK_FILE,DRILL_FILE,EDGE_FILE,MIRROR_FRONT,MIRROR_BACK,MIRROR_DRILL,MIRROR_EDGE,ROT_ANG
global OUT_DIR,OUT_FRONT_FILE,OUT_FRONT_2PASS_FILE,OUT_FRONT_3PASS_FILE,OUT_BACK_FILE,OUT_BACK_2PASS_FILE,OUT_BACK_3PASS_FILE,OUT_DRILL_FILE,OUT_EDGE_FILE
try:
f = open(config_file,'r')
except IOError, (errno, strerror):
print "Unable to open the file =" + config_file + "\n"
else:
with open(config_file,'r') as f:
while 1:
config = f.readline()
#print config
#print(config
if not config:
break
#cfg = re.search("([A-Z\_]+)[\d\s\ ]*\=[\ \"]*([\s\/\-\d\.\_]+)\"*",config)
cfg = re.search("([A-Z0-9\_]+)[\d\s\ ]*\=[\ \"]*([^\ \"\n\r]+)\"*",config) # FIXED: Now variable names can have numbers
if (cfg):
#print str(cfg.group(1)),"=",str(cfg.group(2))
#print(str(cfg.group(1)),"=",str(cfg.group(2))
if(cfg.group(1)=="INI_X"):
#print "ini x =",cfg.group(2)
#print("ini x =",cfg.group(2)
INI_X = float(cfg.group(2))
if(cfg.group(1)=="INI_Y"):
INI_Y = float(cfg.group(2))
@ -450,10 +446,10 @@ def read_config(config_file):
GEDGE_EXT = str(cfg.group(2))
if(cfg.group(1)=="GERBER_DIR"):
#print "dir =",cfg.group(2)
#print("dir =",cfg.group(2)
GERBER_DIR = str(cfg.group(2))
if(cfg.group(1)=="FRONT_FILE"):
#print "front =",cfg.group(2)
#print("front =",cfg.group(2)
FRONT_FILE = str(cfg.group(2))
if(cfg.group(1)=="BACK_FILE"):
BACK_FILE = str(cfg.group(2))
@ -490,6 +486,8 @@ def read_config(config_file):
if(cfg.group(1)=="OUT_EDGE_FILE"):
OUT_EDGE_FILE = str(cfg.group(2))
f.close()
return
raise Exception("Unable to open the file " + config_file + "\n")
def set_unit():
global IN_INCH_FLAG, OUT_INCH_FLAG, gUNIT, INCH
@ -542,26 +540,26 @@ def read_Gerber(dirname,filename):
#global IN_INCH_FLAG
global gGCODES
gGCODES = []
print "Parse Gerber data"
print("Parse Gerber data")
(data,f) = open_file(dirname, filename)
for gerber in data:
if not gerber:
break
# print gerber
if (find(gerber, "%MOIN") != -1):
# print(gerber
if (gerber.find("%MOIN") != -1):
IN_INCH_FLAG = 1
if (find(gerber, "%ADD") != -1):
if (gerber.find("%ADD") != -1):
parse_add(gerber)
if(find(gerber, "%AM") != -1):
if(gerber.find("%AM") != -1):
#do nothing
print "Ignoring %AM..."
if (find(gerber, "D") == 0):
print("Ignoring %AM...")
if (gerber.find("D") == 0):
parse_d(gerber)
if (find(gerber, "G") != -1):
if (gerber.find("G") != -1):
parse_g(gerber)
#if (find(gerber, "X") != -1 or find(gerber, "Y") != -1):
if (find(gerber, "X") == 0):
if (gerber.find("X") == 0):
parse_xy(gerber)
f.close()
return gGCODES
@ -586,16 +584,16 @@ def parse_add(gerber):
gDCODE[int(d_num)] = D_DATA(aperture_type,mod1,mod2)
def parse_d(gerber):
global g54_FLAG, gFIG_NUM
#print gerber
index_d=find(gerber, "D")
index_ast=find(gerber, "*")
#print(gerber
index_d=gerber.find("D")
index_ast=gerber.find("*")
g54_FLAG = 1
gFIG_NUM=gerber[index_d+1:index_ast]
def parse_g(gerber):
global gTMP_X, gTMP_Y, gTMP_Z, g54_FLAG, gFIG_NUM
index_d=find(gerber, "D")
index_ast=find(gerber, "*")
if (find(gerber, "54",1,index_d) !=-1):
index_d=gerber.find("D")
index_ast=gerber.find("*")
if (gerber.find("54",1,index_d) !=-1):
g54_FLAG = 1
else:
g54_FLAG = 0
@ -641,8 +639,8 @@ def parse_data(x,y,d):
gGCODES.append(GCODE(x,y,0,0,2,mod1,mod2))
elif(gDCODE[int(gFIG_NUM)].atype == "O"):
gGCODES.append(GCODE(x,y,0,0,6,mod1,mod2))
#print "Oval 03"
else: print "UNSUPPORTED SHAPE TYPE:",gDCODE[int(gFIG_NUM)].atype
#print("Oval 03"
else: print("UNSUPPORTED SHAPE TYPE: " + str(gDCODE[int(gFIG_NUM)].atype))
elif(d == "02" or d == "2"):
#move w light off
gGERBER_TMP_X = x
@ -656,8 +654,8 @@ def parse_data(x,y,d):
gGCODES.append(GCODE(gGERBER_TMP_X,gGERBER_TMP_Y,x,y,4,mod1,mod2))
elif(gDCODE[int(gFIG_NUM)].atype == "O"):
gGCODES.append(GCODE(gGERBER_TMP_X,gGERBER_TMP_Y,x,y,4,mod1,mod2)) # TODO FIX: This oval will be shown as a rectangle!
print "Oval pad will appear as a rectangle!"
else: print "UNSUPPORTED SHAPE TYPE:",gDCODE[int(gFIG_NUM)].atype
print("Oval pad will appear as a rectangle!")
else: print("UNSUPPORTED SHAPE TYPE: " + str(gDCODE[int(gFIG_NUM)].atype))
gGERBER_TMP_X = x
gGERBER_TMP_Y = y
@ -760,7 +758,7 @@ def polygon(points):
y_max=-HUGE
y_min=HUGE
if(len(points)<=2):
print "Error: polygon point"
print("Error: polygon point")
return
i = 0
while i< len(points):
@ -794,12 +792,12 @@ def circle_points(cx,cy,r,points_num):
elif new_points_num > 50 :
new_points_num = 50
#print "Modifying CIRCLE points_num from",points_num,"to",new_points_num
#print("Modifying CIRCLE points_num from",points_num,"to",new_points_num
points_num = new_points_num
# print "Circle: Radius:", str(r), "Points:", points_num
# print("Circle: Radius:", str(r), "Points:", points_num
points=[]
# if(points_num <= 2):
# print "Too small angle at Circle"
# print("Too small angle at Circle"
# return
i = points_num
while i > 0:
@ -867,15 +865,15 @@ def end(front_poly,back_poly,front_poly_2pass,back_poly_2pass,front_poly_3pass,b
def polygon2gcode(gPOLYGONS,height,xy_speed,z_speed):
#global gPOLYGONS
print "Convert to G-code"
#print len(gPOLYGONS)
print("Convert to G-code")
#print(len(gPOLYGONS)
#i=0
ret_data = ""
for poly in gPOLYGONS:
if (poly.delete):
continue
ret_data += path(height,xy_speed,z_speed,poly.points)
#print i
#print(i
#i+=1
return ret_data
def path(height,xy_speed,z_speed,points):
@ -884,7 +882,7 @@ def path(height,xy_speed,z_speed,points):
out_data = "G1"
gcode_tmp_flag = 0
if(len(points) % 2):
print "Number of points is illegal "
print("Number of points is illegal ")
#move to Start position
ret_data += move(points[0]+float(gXSHIFT),points[1]+float(gYSHIFT))
#move to cuting heght
@ -910,7 +908,7 @@ def path(height,xy_speed,z_speed,points):
out_data ="G1"
gcode_tmp_flag=0
i += 2
#print gFRONT_DATA
#print(gFRONT_DATA
return ret_data
def move(x,y):
global gFRONT_DATA, MOVE_HEIGHT, gTMP_X, gTMP_Y, gTMP_Z
@ -947,15 +945,15 @@ def arc_points(cx,cy,r,s_angle,e_angle,kaku):
elif new_kaku > 50 :
new_kaku = 50
if kaku != new_kaku:
#print "Modifying ARC points from",kaku,"to",new_kaku
#print("Modifying ARC points from",kaku,"to",new_kaku
kaku = new_kaku
# print "Arc: Radius:", str(r), "Points:", kaku
# print("Arc: Radius:", str(r), "Points:", kaku
points=[]
if(s_angle == e_angle):
print "Start and End angle are same"
print("Start and End angle are same")
if(kaku <= 2):
print "Too small angle"
print("Too small angle")
arc_x=float(cx+r*cos(float(s_angle))) # Draw a line
arc_y=float(cy+r*sin(float(s_angle)))
points.extend([arc_x,arc_y])
@ -977,7 +975,7 @@ def calc_shift():
global gXSHIFT, gYSHIFT, gXMIN, gYMIN, LEFT_X, LOWER_Y
gXSHIFT = LEFT_X - gXMIN
gYSHIFT = LOWER_Y - gYMIN
#print "x_shift=" + str(gXSHIFT) + "y_shift=" + str(gYSHIFT)
#print("x_shift=" + str(gXSHIFT) + "y_shift=" + str(gYSHIFT)
def polygon2line(points,sw):
global gLINES,gLINES2
@ -1028,7 +1026,7 @@ def mirror_poly(polygons):
i += 2
return polygons
def rot_point(x,y):
#print "rot ang =",ang
#print("rot ang =",ang
add_ang = pi * float(ROT_ANG)/180
xc = (gXMIN+gXMAX)/2
yc = (gYMIN+gYMAX)/2
@ -1039,7 +1037,7 @@ def rot_point(x,y):
rot_ang = ini_ang + add_ang
new_x =xc + r * cos(rot_ang)
new_y =yc + r * sin(rot_ang)
#print new_x
#print(new_x
return new_x,new_y
def mirror_point(x,y):
@ -1051,7 +1049,7 @@ def mirror_point(x,y):
def read_Drill_file(dirname,drill_file):
global gDRILL_D, gDRILL_TYPE, DRILL_UNIT,gUNIT,INCH
(data,f) = open_file(dirname, drill_file)
print "Read and Parse Drill data"
print("Read and Parse Drill data")
drill_d_unit = DRILL_UNIT
for drill in data:
if not drill:
@ -1061,24 +1059,24 @@ def read_Drill_file(dirname,drill_file):
if(drill_data):
gDRILL_TYPE[int(drill_data.group(1))] = drill_data.group(2)
if(drill_num):
#print drill_d_unit
#print(drill_d_unit
gDRILL_D=float(gDRILL_TYPE[int(drill_num.group(1))]) * drill_d_unit
#gDRILL_D=float(gDRILL_TYPE[int(drill_num.group(1))]) * gUNIT
if (find(drill, "G") != -1):
if (drill.find("G") != -1):
parse_drill_g(drill)
elif (find(drill, "X") != -1 or find(drill, "Y") != -1):
elif (drill.find("X") != -1 or drill.find("Y") != -1):
parse_drill_xy(drill)
if (find(drill, "INCH") != -1):
if (drill.find("INCH") != -1):
drill_d_unit = INCH
#print "Drill Diameter = INCH"
if (find(drill, "M72") != -1):
#print "Drill unit = INCH"
#print("Drill Diameter = INCH"
if (drill.find("M72") != -1):
#print("Drill unit = INCH"
DRILL_UNIT = INCH
f.close()
def parse_drill_g(drill):
global gDRILL_LINES, gDRILL_D, DRILL_UNIT
#print "Drill G";
#print("Drill G";
#xx = re.search("X([\d\.-]+)\D",drill)
#yy = re.search("Y([\d\.-]+)\D",drill)
xy = re.search("X([\d\.-]+)Y([\d\.-]+)\D[\d]+X([\d\.-]+)Y([\d\.-]+)",drill)
@ -1091,8 +1089,8 @@ def parse_drill_g(drill):
y1=float(xy.group(2)) * DRILL_UNIT
x2=float(xy.group(3)) * DRILL_UNIT
y2=float(xy.group(4)) * DRILL_UNIT
#print "x1=" + str(x1) + "y1=" + str(y1) + "x2=" + str(x2) + "y2=" + str(y2)
#print "gDRILL_D =",gDRILL_D
#print("x1=" + str(x1) + "y1=" + str(y1) + "x2=" + str(x2) + "y2=" + str(y2)
#print("gDRILL_D =",gDRILL_D
gDRILL_LINES.append(DRILL_LINE(x1,y1,x2,y2,gDRILL_D,0))
def parse_drill_xy(drill):
@ -1103,7 +1101,7 @@ def parse_drill_xy(drill):
x=float(xx.group(1)) * DRILL_UNIT
if(yy):
y=float(yy.group(1)) * DRILL_UNIT
#print "gDRILL_D =",gDRILL_D
#print("gDRILL_D =",gDRILL_D
gDRILLS.append(DRILL(x,y,gDRILL_D,0))
def do_drill():
@ -1124,12 +1122,12 @@ def do_drill():
x,y = mirror_point(x,y)
x = x + gXSHIFT
y = y + gYSHIFT
#print "drill.d=" + str(drill.d) + ", DRILL_D=" + str(DRILL_D)
#print("drill.d=" + str(drill.d) + ", DRILL_D=" + str(DRILL_D)
#move to hole position
#print "drill_d =", drill.d, " , DRILL_D =",DRILL_D
#print("drill_d =", drill.d, " , DRILL_D =",DRILL_D
if(drill.d > DRILL_D + drill_mergin):
cir_r = drill.d/2 - DRILL_D/2
#print cir_r
#print(cir_r
#drill_data += move_drill(drill.x-cir_r,drill.y)
drill_data += drill_hole(x,y,cir_r)
else:
@ -1142,7 +1140,7 @@ def do_drill():
#Goto moving Z position
drill_data += "G0 Z" + floats(MOVE_HEIGHT) + "\n"
gTMP_DRILL_Z = MOVE_HEIGHT
#print "len gDRILL_LINES=" +str(len(gDRILL_LINES))
#print("len gDRILL_LINES=" +str(len(gDRILL_LINES))
for drill_l in gDRILL_LINES:
x1 = drill_l.x1
y1 = drill_l.y1
@ -1173,7 +1171,7 @@ def move_drill(x,y):
global MOVE_HEIGHT, gTMP_DRILL_X, gTMP_DRILL_Y, gTMP_DRILL_Z
xy_data = "G0"
out_data = ""
#print out_data
#print(out_data
gcode_tmp_flag = 0
if(x != gTMP_DRILL_X):
gTMP_DRILL_X = x
@ -1255,8 +1253,8 @@ def drill_line(x1,y1,x2,y2,d):
tmp_y = y2
#gDRAWDRILL_LINE.append(DRAWPOLY(points,"",0))
out_data += "G0 X" + floats(tmp_x) + " Y" + floats(tmp_y) + "\n"
#print z_step_n
#print len(points)
#print(z_step_n
#print(len(points)
i = 1
while i <= z_step_n:
gTMP_DRILL_Z = i*z_step
@ -1294,7 +1292,7 @@ def drill_hole(cx,cy,r):
# r = r/2.0 # REDUCE DRILL SIZE
z_step_n = int(float(DRILL_DEPTH)/float(Z_STEP_DRILL)) + 1
z_step = float(DRILL_DEPTH)/z_step_n
#print "r=" + str(r)
#print("r=" + str(r)
if(MOVE_HEIGHT != gTMP_DRILL_Z):
gTMP_DRILL_Z = MOVE_HEIGHT
out_data += "G0 Z" + floats(gTMP_DRILL_Z) + " F" + floats(DRILL_SPEED) + "\n" # MOD
@ -1339,7 +1337,7 @@ def drill_hole_test(cx,cy,r):
gcode_tmp_flag = 0
z_step_n = int(DRILL_DEPTH/Z_STEP_DRILL) + 1
z_step = DRILL_DEPTH/z_step_n
#print "r=" + str(r)
#print("r=" + str(r)
if(MOVE_HEIGHT != gTMP_DRILL_Z):
gTMP_DRILL_Z = MOVE_HEIGHT
out_data += "G0 Z" + floats(gTMP_DRILL_Z) + "\n"
@ -1441,9 +1439,9 @@ def edge2gcode():
points = edge.points
if(len(points) % 2):
error_dialog("Error:Number of points is illegal ",0)
#print "Number of points is illegal "
#print "x=" + str(gTMP_EDGE_X) + ", y=" + str(gTMP_EDGE_Y)
#print "x=" + str(float(points[0])+float(gXSHIFT)) + ", y=" + str(float(points[1])+float(gYSHIFT))
#print("Number of points is illegal "
#print("x=" + str(gTMP_EDGE_X) + ", y=" + str(gTMP_EDGE_Y)
#print("x=" + str(float(points[0])+float(gXSHIFT)) + ", y=" + str(float(points[1])+float(gYSHIFT))
#move to Start position
gEDGE_DATA += move_edge(float(points[0]),float(points[1]))
#move to cuting heght
@ -1486,7 +1484,7 @@ def move_edge(x,y):
y=y+float(gYSHIFT)
xy_data = "G0"
out_data = ""
#print out_data
#print(out_data
gcode_tmp_flag = 0
if(x != gTMP_EDGE_X):
gTMP_EDGE_X = x
@ -1514,14 +1512,10 @@ def points_revers(points):
return return_points
def open_file(dirname, filename):
file_name = os.path.join(dirname, filename)
try:
f = open(file_name,'r')
except IOError, (errno, strerror):
print "Unable to open the file" + file_name + "\n"
return []
else:
with open(file_name,'r') as f:
ret = f.read()
return (ret.split("\n"),f)
raise Exception("Unable to open the file " + file_name + "\n")
def write_file(dirname,filename,datas):
file_name = os.path.join(dirname, filename)
if(datas):
@ -1529,6 +1523,6 @@ def write_file(dirname,filename,datas):
f.write(datas)
f.close()
else:
print "ERROR : No save data"
print("ERROR : No save data")
if __name__ == "__main__":
main()

Binary file not shown.

View File

@ -13,8 +13,8 @@ GRID_N_POINTS = (4,4) # Number of points (AT LEAST 4 IN EACH DIRECTION, OTHERWIS
Zlift = 0.5 # mm # Lift between probings, it is relative so should be enough
# For Zprobe and Send
F_fastMove = 700 # mm/s
F_slowMove = 200 # mm/s
F_fastMove = 70000 # mm/s
F_slowMove = 20000 # mm/s
initial_Z_lowering_distance = -5 # Warning: Do not lower too much or you will potentially cause damage!
N_copies_X = 2 # Panelizing options!

View File

@ -12,13 +12,13 @@ import pickle # For file saving
def saveToFile(data,path):
with open(path, 'wb') as path_file:
ret = pickle.dump(data, path_file)
ret = pickle.dump(data, path_file, protocol=2)
path_file.close()
return ret
raise Exception("Could not save " + path)
def loadFromFile(path):
with open(path) as path_file:
with open(path, 'rb') as path_file:
ret = pickle.load(path_file)
path_file.close()
return ret