Added 2&3 extra tool passes (for more clearance). Fixed bug when parsing oval shapes from gerber files.
parent
a828e2a0d1
commit
ce7c72bd00
File diff suppressed because it is too large
Load Diff
|
@ -1,60 +1,59 @@
|
|||
(Generated by ./pygerber2gcode_cui_MOD.py )
|
||||
( 2013-05-29 04:57:18 )
|
||||
( 2013-05-29 17:29:04 )
|
||||
(Initialize)
|
||||
G92 X0.000000 Y0.000000 Z0.000000
|
||||
|
||||
(Start form here)
|
||||
G0 Z2.000000
|
||||
G0 X58.713215 Y57.951215
|
||||
G0 X59.163215 Y58.401215
|
||||
G1 Z-0.271429 F30.000000
|
||||
G1 X2.579215 F50.000000
|
||||
G1 Y4.103215 F50.000000
|
||||
G1 Y3.849215 F50.000000
|
||||
G1 X59.983215 F50.000000
|
||||
G1 Y57.951215 F50.000000
|
||||
G1 X58.713215 F50.000000
|
||||
G1 X3.029215 F50.000000
|
||||
G1 Y4.553215 F50.000000
|
||||
G1 Y4.299215 F50.000000
|
||||
G1 X60.433215 F50.000000
|
||||
G1 Y58.401215 F50.000000
|
||||
G1 X59.163215 F50.000000
|
||||
G1 Z-0.542857 F30.000000
|
||||
G1 X2.579215 F50.000000
|
||||
G1 Y4.103215 F50.000000
|
||||
G1 Y3.849215 F50.000000
|
||||
G1 X59.983215 F50.000000
|
||||
G1 Y57.951215 F50.000000
|
||||
G1 X58.713215 F50.000000
|
||||
G1 X3.029215 F50.000000
|
||||
G1 Y4.553215 F50.000000
|
||||
G1 Y4.299215 F50.000000
|
||||
G1 X60.433215 F50.000000
|
||||
G1 Y58.401215 F50.000000
|
||||
G1 X59.163215 F50.000000
|
||||
G1 Z-0.814286 F30.000000
|
||||
G1 X2.579215 F50.000000
|
||||
G1 Y4.103215 F50.000000
|
||||
G1 Y3.849215 F50.000000
|
||||
G1 X59.983215 F50.000000
|
||||
G1 Y57.951215 F50.000000
|
||||
G1 X58.713215 F50.000000
|
||||
G1 X3.029215 F50.000000
|
||||
G1 Y4.553215 F50.000000
|
||||
G1 Y4.299215 F50.000000
|
||||
G1 X60.433215 F50.000000
|
||||
G1 Y58.401215 F50.000000
|
||||
G1 X59.163215 F50.000000
|
||||
G1 Z-1.085714 F30.000000
|
||||
G1 X2.579215 F50.000000
|
||||
G1 Y4.103215 F50.000000
|
||||
G1 Y3.849215 F50.000000
|
||||
G1 X59.983215 F50.000000
|
||||
G1 Y57.951215 F50.000000
|
||||
G1 X58.713215 F50.000000
|
||||
G1 X3.029215 F50.000000
|
||||
G1 Y4.553215 F50.000000
|
||||
G1 Y4.299215 F50.000000
|
||||
G1 X60.433215 F50.000000
|
||||
G1 Y58.401215 F50.000000
|
||||
G1 X59.163215 F50.000000
|
||||
G1 Z-1.357143 F30.000000
|
||||
G1 X2.579215 F50.000000
|
||||
G1 Y4.103215 F50.000000
|
||||
G1 Y3.849215 F50.000000
|
||||
G1 X59.983215 F50.000000
|
||||
G1 Y57.951215 F50.000000
|
||||
G1 X58.713215 F50.000000
|
||||
G1 X3.029215 F50.000000
|
||||
G1 Y4.553215 F50.000000
|
||||
G1 Y4.299215 F50.000000
|
||||
G1 X60.433215 F50.000000
|
||||
G1 Y58.401215 F50.000000
|
||||
G1 X59.163215 F50.000000
|
||||
G1 Z-1.628571 F30.000000
|
||||
G1 X2.579215 F50.000000
|
||||
G1 Y4.103215 F50.000000
|
||||
G1 Y3.849215 F50.000000
|
||||
G1 X59.983215 F50.000000
|
||||
G1 Y57.951215 F50.000000
|
||||
G1 X58.713215 F50.000000
|
||||
G1 X3.029215 F50.000000
|
||||
G1 Y4.553215 F50.000000
|
||||
G1 Y4.299215 F50.000000
|
||||
G1 X60.433215 F50.000000
|
||||
G1 Y58.401215 F50.000000
|
||||
G1 X59.163215 F50.000000
|
||||
G1 Z-1.900000 F30.000000
|
||||
G1 X2.579215 F50.000000
|
||||
G1 Y4.103215 F50.000000
|
||||
G1 Y3.849215 F50.000000
|
||||
G1 X59.983215 F50.000000
|
||||
G1 Y57.951215 F50.000000
|
||||
G1 X58.713215 F50.000000
|
||||
G1 X3.029215 F50.000000
|
||||
G1 Y4.553215 F50.000000
|
||||
G1 Y4.299215 F50.000000
|
||||
G1 X60.433215 F50.000000
|
||||
G1 Y58.401215 F50.000000
|
||||
G1 X59.163215 F50.000000
|
||||
|
||||
(Goto to Initial position)
|
||||
G0 Z2.000000
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -11,6 +11,10 @@ ROT_ANG = 0
|
|||
OUT_DIR = "./out"
|
||||
OUT_FRONT_FILE = ""
|
||||
OUT_BACK_FILE = "printshield_etch.gcode"
|
||||
OUT_FRONT_2PASS_FILE = ""
|
||||
OUT_BACK_2PASS_FILE = "printshield_etch2pass.gcode"
|
||||
OUT_FRONT_3PASS_FILE = ""
|
||||
OUT_BACK_3PASS_FILE = "printshield_etch3pass.gcode"
|
||||
OUT_DRILL_FILE = "printshield_drill.gcode"
|
||||
OUT_EDGE_FILE = "printshield_edge.gcode"
|
||||
|
||||
|
@ -29,6 +33,8 @@ DRILL_SPEED=30
|
|||
DRILL_DEPTH=-1.7
|
||||
CUT_DEPTH=-0.04
|
||||
TOOL_D=0.1
|
||||
TOOL_2PASS_D=0.5
|
||||
TOOL_3PASS_D=1
|
||||
DRILL_D=0.5
|
||||
CAD_UNIT=0.00254
|
||||
DRILL_UNIT=0.00254
|
||||
|
|
|
@ -36,7 +36,9 @@ Z_SPEED = 60
|
|||
DRILL_SPEED = 50 #Drill down speed
|
||||
DRILL_DEPTH = -1.2#Drill depth
|
||||
CUT_DEPTH = -0.07 #pattern cutting depth
|
||||
TOOL_D = 0.2 #Tool diameter
|
||||
TOOL_D = 0.1 #Tool diameter
|
||||
TOOL_2PASS_D = 0.5 #Tool diameter
|
||||
TOOL_3PASS_D = 1 #Tool diameter
|
||||
DRILL_D = 0.8 #Drill diameter
|
||||
EDGE_TOOL_D = 1.0 #Edge Tool diameter
|
||||
EDGE_DEPTH = -1.2 #edge depth
|
||||
|
@ -83,7 +85,11 @@ MIRROR_EDGE = 0
|
|||
ROT_ANG = 0
|
||||
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 = ""
|
||||
|
||||
|
@ -96,6 +102,10 @@ gXSHIFT = 0
|
|||
gYSHIFT = 0
|
||||
gFRONT_DATA = ""
|
||||
gBACK_DATA = ""
|
||||
gFRONT_2PASS_DATA = ""
|
||||
gBACK_2PASS_DATA = ""
|
||||
gFRONT_3PASS_DATA = ""
|
||||
gBACK_3PASS_DATA = ""
|
||||
gDRILL_DATA = ""
|
||||
gEDGE_DATA = ""
|
||||
gTMP_X = INI_X
|
||||
|
@ -221,6 +231,7 @@ class GCODE:
|
|||
|
||||
#functions
|
||||
def main():
|
||||
global TOOL_D
|
||||
if len(sys.argv) > 1:
|
||||
read_config(sys.argv[1])
|
||||
else :
|
||||
|
@ -229,6 +240,10 @@ def main():
|
|||
gcode_init()
|
||||
front_poly = []
|
||||
back_poly = []
|
||||
front_poly_2pass = []
|
||||
back_poly_2pass = []
|
||||
front_poly_3pass = []
|
||||
back_poly_3pass = []
|
||||
if FRONT_FILE:
|
||||
#print "Front file =",FRONT_FILE
|
||||
front_gerber = read_Gerber(GERBER_DIR,FRONT_FILE)
|
||||
|
@ -243,6 +258,42 @@ def main():
|
|||
if MIRROR_FRONT:
|
||||
front_poly = mirror_poly(front_poly)
|
||||
print len(front_poly)
|
||||
if TOOL_2PASS_D > 0:
|
||||
print "Processing 2nd pass..."
|
||||
PREV_TOOL_D = TOOL_D
|
||||
TOOL_D = TOOL_2PASS_D # Set the thicker tool
|
||||
#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)
|
||||
front_poly_2pass = gerber2polygon(front_gerber_2pass)
|
||||
#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)
|
||||
TOOL_D = PREV_TOOL_D
|
||||
if TOOL_3PASS_D > 0:
|
||||
print "Processing 3nd pass..."
|
||||
PREV_TOOL_D = TOOL_D
|
||||
TOOL_D = TOOL_3PASS_D # Set the thicker tool
|
||||
#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)
|
||||
front_poly_3pass = gerber2polygon(front_gerber_3pass)
|
||||
#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)
|
||||
TOOL_D = PREV_TOOL_D
|
||||
if BACK_FILE:
|
||||
back_gerber = read_Gerber(GERBER_DIR,BACK_FILE)
|
||||
#back_gerber = gm.merge_lines(back_gerber)
|
||||
|
@ -254,6 +305,36 @@ def main():
|
|||
if MIRROR_BACK:
|
||||
back_poly = mirror_poly(back_poly)
|
||||
print len(back_poly)
|
||||
if TOOL_2PASS_D > 0:
|
||||
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)
|
||||
#back_gerber = gm.merge_lines(back_gerber)
|
||||
back_gerber_2pass = gm.check_duplication(back_gerber_2pass)
|
||||
back_poly_2pass = gerber2polygon(back_gerber_2pass)
|
||||
back_poly_2pass = gm.merge(back_poly_2pass, LINE, gLINES,gLINES2)
|
||||
if abs(float(ROT_ANG)) > TINY:
|
||||
back_poly_2pass = rot_poly(back_poly_2pass)
|
||||
if MIRROR_BACK:
|
||||
back_poly_2pass = mirror_poly(back_poly_2pass)
|
||||
print len(back_poly_2pass)
|
||||
TOOL_D = PREV_TOOL_D
|
||||
if TOOL_3PASS_D > 0:
|
||||
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)
|
||||
#back_gerber = gm.merge_lines(back_gerber)
|
||||
back_gerber_3pass = gm.check_duplication(back_gerber_3pass)
|
||||
back_poly_3pass = gerber2polygon(back_gerber_3pass)
|
||||
back_poly_3pass = gm.merge(back_poly_3pass, LINE, gLINES,gLINES2)
|
||||
if abs(float(ROT_ANG)) > TINY:
|
||||
back_poly_3pass = rot_poly(back_poly_3pass)
|
||||
if MIRROR_BACK:
|
||||
back_poly_3pass = mirror_poly(back_poly_3pass)
|
||||
print len(back_poly_3pass)
|
||||
TOOL_D = PREV_TOOL_D
|
||||
if DRILL_FILE:
|
||||
read_Drill_file(GERBER_DIR,DRILL_FILE)
|
||||
if(len(gDRILLS) > 0):
|
||||
|
@ -265,12 +346,12 @@ def main():
|
|||
edge2gcode()
|
||||
#gm.merge(gPOLYGONS, LINE, gLINES,gLINES2)
|
||||
|
||||
end(front_poly,back_poly)
|
||||
end(front_poly,back_poly,front_poly_2pass,back_poly_2pass,front_poly_3pass,back_poly_3pass)
|
||||
|
||||
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, DRILL_D, CAD_UNIT, EDGE_TOOL_D, EDGE_DEPTH, EDGE_SPEED, EDGE_Z_SPEED, MERGE_DRILL_DATA, Z_STEP, 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 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, 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_BACK_FILE,OUT_DRILL_FILE,OUT_EDGE_FILE
|
||||
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):
|
||||
|
@ -282,8 +363,9 @@ def read_config(config_file):
|
|||
if not config:
|
||||
break
|
||||
#cfg = re.search("([A-Z\_]+)[\d\s\ ]*\=[\ \"]*([\s\/\-\d\.\_]+)\"*",config)
|
||||
cfg = re.search("([A-Z\_]+)[\d\s\ ]*\=[\ \"]*([^\ \"\n\r]+)\"*",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))
|
||||
if(cfg.group(1)=="INI_X"):
|
||||
#print "ini x =",cfg.group(2)
|
||||
INI_X = float(cfg.group(2))
|
||||
|
@ -319,6 +401,10 @@ def read_config(config_file):
|
|||
CUT_DEPTH = float(cfg.group(2))
|
||||
if(cfg.group(1)=="TOOL_D"):
|
||||
TOOL_D = float(cfg.group(2))
|
||||
if(cfg.group(1)=="TOOL_2PASS_D"):
|
||||
TOOL_2PASS_D = float(cfg.group(2))
|
||||
if(cfg.group(1)=="TOOL_3PASS_D"):
|
||||
TOOL_3PASS_D = float(cfg.group(2))
|
||||
if(cfg.group(1)=="DRILL_D"):
|
||||
DRILL_D = float(cfg.group(2))
|
||||
if(cfg.group(1)=="CAD_UNIT"):
|
||||
|
@ -388,6 +474,14 @@ def read_config(config_file):
|
|||
OUT_FRONT_FILE = str(cfg.group(2))
|
||||
if(cfg.group(1)=="OUT_BACK_FILE"):
|
||||
OUT_BACK_FILE = str(cfg.group(2))
|
||||
if(cfg.group(1)=="OUT_FRONT_2PASS_FILE"):
|
||||
OUT_FRONT_2PASS_FILE = str(cfg.group(2))
|
||||
if(cfg.group(1)=="OUT_BACK_2PASS_FILE"):
|
||||
OUT_BACK_2PASS_FILE = str(cfg.group(2))
|
||||
if(cfg.group(1)=="OUT_FRONT_3PASS_FILE"):
|
||||
OUT_FRONT_3PASS_FILE = str(cfg.group(2))
|
||||
if(cfg.group(1)=="OUT_BACK_3PASS_FILE"):
|
||||
OUT_BACK_3PASS_FILE = str(cfg.group(2))
|
||||
if(cfg.group(1)=="OUT_DRILL_FILE"):
|
||||
OUT_DRILL_FILE = str(cfg.group(2))
|
||||
if(cfg.group(1)=="OUT_EDGE_FILE"):
|
||||
|
@ -414,11 +508,11 @@ def points_revers(points):
|
|||
return return_points
|
||||
|
||||
def gcode_init():
|
||||
global gFRONT_DATA, gBACK_DATA, gDRILL_DATA, gEDGE_DATA
|
||||
global gFRONT_DATA, gBACK_DATA, gFRONT_2PASS_DATA, gBACK_2PASS_DATA, gFRONT_3PASS_DATA, gBACK_3PASS_DATA, gDRILL_DATA, gEDGE_DATA
|
||||
gFRONT_DATA += "(Generated by " + sys.argv[0] +" )\n"
|
||||
gFRONT_DATA += "( " + get_date() +" )\n"
|
||||
gFRONT_DATA += "(Initialize)\n"
|
||||
gFRONT_DATA += "G92 X" + floats(INI_X) + " Y" + floats(INI_Y) + " Z" + floats(INI_Z) + "\n"
|
||||
#gFRONT_DATA += "G92 X" + floats(INI_X) + " Y" + floats(INI_Y) + " Z" + floats(INI_Z) + "\n"
|
||||
if OUT_INCH_FLAG:
|
||||
gFRONT_DATA += "(Set to inch unit)\n"
|
||||
gFRONT_DATA += "G20\n"
|
||||
|
@ -431,6 +525,10 @@ def gcode_init():
|
|||
gBACK_DATA = gFRONT_DATA
|
||||
gDRILL_DATA = gFRONT_DATA
|
||||
gEDGE_DATA = gFRONT_DATA
|
||||
gBACK_2PASS_DATA = gFRONT_DATA
|
||||
gFRONT_2PASS_DATA = gFRONT_DATA
|
||||
gBACK_3PASS_DATA = gFRONT_DATA
|
||||
gFRONT_3PASS_DATA = gFRONT_DATA
|
||||
|
||||
def get_date():
|
||||
#d = datetime.datetime.today()
|
||||
|
@ -442,7 +540,7 @@ def read_Gerber(dirname,filename):
|
|||
global gGCODES
|
||||
gGCODES = []
|
||||
print "Parse Gerber data"
|
||||
data = open_file(dirname, filename)
|
||||
(data,f) = open_file(dirname, filename)
|
||||
for gerber in data:
|
||||
if not gerber:
|
||||
break
|
||||
|
@ -462,6 +560,7 @@ def read_Gerber(dirname,filename):
|
|||
#if (find(gerber, "X") != -1 or find(gerber, "Y") != -1):
|
||||
if (find(gerber, "X") == 0):
|
||||
parse_xy(gerber)
|
||||
f.close()
|
||||
return gGCODES
|
||||
|
||||
def parse_add(gerber):
|
||||
|
@ -536,12 +635,11 @@ def parse_data(x,y,d):
|
|||
elif(gDCODE[int(gFIG_NUM)].atype == "R"):
|
||||
#Rect
|
||||
#Change to line
|
||||
gGCODES.append(GCODE(x-mod1/2,y,x+mod1/2,y,4,mod1,mod2))
|
||||
gGCODES.append(GCODE(x,y,0,0,2,mod1,mod2))
|
||||
elif(gDCODE[int(gFIG_NUM)].atype == "O"):
|
||||
#Rect
|
||||
#Change to line
|
||||
gGCODES.append(GCODE(x-mod1/2,y,x+mod1/2,y,6,mod1,mod2))
|
||||
else: print "UNSUPPORTED TYPE:",gDCODE[int(gFIG_NUM)].atype
|
||||
gGCODES.append(GCODE(x,y,0,0,6,mod1,mod2))
|
||||
#print "Oval 03"
|
||||
else: print "UNSUPPORTED SHAPE TYPE:",gDCODE[int(gFIG_NUM)].atype
|
||||
elif(d == "02" or d == "2"):
|
||||
#move w light off
|
||||
gGERBER_TMP_X = x
|
||||
|
@ -554,9 +652,9 @@ def parse_data(x,y,d):
|
|||
#Rect
|
||||
gGCODES.append(GCODE(gGERBER_TMP_X,gGERBER_TMP_Y,x,y,4,mod1,mod2))
|
||||
elif(gDCODE[int(gFIG_NUM)].atype == "O"):
|
||||
#Rect
|
||||
gGCODES.append(GCODE(gGERBER_TMP_X,gGERBER_TMP_Y,x,y,6,mod1,mod2))
|
||||
else: print "UNSUPPORTED TYPE:",gDCODE[int(gFIG_NUM)].atype
|
||||
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
|
||||
gGERBER_TMP_X = x
|
||||
gGERBER_TMP_Y = y
|
||||
|
||||
|
@ -575,11 +673,9 @@ def gerber2polygon(gGCODES):
|
|||
mod1=gcode.mod1 + float(TOOL_D)
|
||||
mod2=gcode.mod2 + float(TOOL_D)
|
||||
if(gcode.gtype == 1):
|
||||
#polygon(circle_points(x1,y1,mod1/2,20))
|
||||
gPOLYGONS.append(POLYGON(x1-mod1/2,x1+mod1/2,y1-mod1/2,y1+mod1/2,circle_points(x1,y1,mod1/2,20),0))
|
||||
elif(gcode.gtype == 2):
|
||||
points = [x1-mod1/2,y1-mod2/2,x1-mod1/2,y1+mod2/2,x1+mod1/2,y1+mod2/2,x1+mod1/2,y1-mod2/2,x1-mod1/2,y1-mod2/2]
|
||||
#polygon([x1-mod1/2,y1-mod2/2,x1-mod1/2,y1+mod2/2,x1+mod1/2,y1+mod2/2,x1+mod1/2,y1-mod2/2,x1-mod1/2,y1-mod2/2])
|
||||
gPOLYGONS.append(POLYGON(x1-mod1/2,x1+mod1/2,y1-mod2/2,y1+mod2/2,points,0))
|
||||
elif(gcode.gtype == 3):
|
||||
line2poly(x1,y1,x2,y2,mod1/2,1,8)
|
||||
|
@ -587,8 +683,31 @@ def gerber2polygon(gGCODES):
|
|||
line2poly(x1,y1,x2,y2,mod2/2,0,8)
|
||||
elif(gcode.gtype == 5):
|
||||
line2poly(x1,y1,x2,y2,mod1/2,2,8)
|
||||
elif(gcode.gtype == 6): # Oval
|
||||
line2poly(x1,y1,x2,y2,mod2/2,3,8)
|
||||
elif(gcode.gtype == 6): # Oval (no rotation)
|
||||
width = abs(mod1) # abs((x1+mod1/2)-(x1-mod1/2)) # abs(x_max-x_min)
|
||||
height = abs(mod2) # abs((y1+mod2/2)-(y1-mod2/2)) # abs(y_max-y_min)
|
||||
deg90=pi/2.0
|
||||
npoints = 16
|
||||
x1 = x1 - width/2
|
||||
y1 = y1 - height/2
|
||||
if width > height: # (___)
|
||||
radius = height/2
|
||||
# arc_points(cx,cy,r,s_angle,e_angle,kaku)
|
||||
points = [x1+width-radius,y1]
|
||||
points = points + arc_points(x1+width-radius,y1+radius,radius,-deg90,deg90,npoints)
|
||||
points = points + arc_points(x1+radius,y1+radius,radius,deg90,3*deg90,npoints)
|
||||
points = points + [x1+width-radius,y1]
|
||||
else: # 0
|
||||
radius = width/2
|
||||
# arc_points(cx,cy,r,s_angle,e_angle,kaku)
|
||||
points = [x1+width,y1+height-radius]
|
||||
points = points + arc_points(x1+radius,y1+height-radius,radius,0,2*deg90,npoints)
|
||||
points = points + arc_points(x1+radius,y1+radius,radius,2*deg90,4*deg90,npoints)
|
||||
points = points + [x1+width,y1+height-radius]
|
||||
#points = [x1-mod1/2,y1-mod2/2,x1-mod1/2,y1+mod2/2,x1+mod1/2,y1+mod2/2,x1+mod1/2,y1-mod2/2,x1-mod1/2,y1-mod2/2]
|
||||
#gPOLYGONS.append(POLYGON(x1-mod1/2,x1+mod1/2,y1-mod2/2,y1+mod2/2,points,0))
|
||||
polygon(points)
|
||||
# POLYGON arguments: (x_min, x_max, y_min, y_max, points, delete)
|
||||
return gPOLYGONS
|
||||
|
||||
def line2poly(x1,y1,x2,y2,r,atype,ang_n):
|
||||
|
@ -613,19 +732,20 @@ def line2poly(x1,y1,x2,y2,r,atype,ang_n):
|
|||
points = points + [xa2,ya2,xa1,ya1]
|
||||
points = points + arc_points(x2,y2,r,ang+deg90,ang-deg90,ang_n)
|
||||
points = points + [xa2,ya2]
|
||||
elif(atype==3): # Oval
|
||||
width = abs(xa1-xb2)
|
||||
height = abs(ya1-yb2)
|
||||
if width > height:
|
||||
points = points + arc_points(x1+r,y1,r,ang+3*deg90,ang+deg90,ang_n)
|
||||
points = points + arc_points(x2-r,y2,r,ang+1*deg90,ang-deg90,ang_n)
|
||||
points = points + [xa2+r,ya2]
|
||||
else:
|
||||
r = width/2
|
||||
points = points + arc_points(x1+r,y1+r,r,ang+2*deg90,ang+deg90-deg90,ang_n)
|
||||
points = points + arc_points(x2-r,y2-r,r,ang+0*deg90,ang-deg90-deg90,ang_n)
|
||||
ya1=y1+r*sin(ang+deg90)
|
||||
points = points + [xa1,ya1]
|
||||
elif(atype==3): # Oval #TODO FIX
|
||||
points = (xa1,ya1,xb1,yb1,xb2,yb2,xa2,ya2,xa1,ya1)
|
||||
# width = abs(xa1-xb2)
|
||||
# height = abs(ya1-yb2)
|
||||
# if width > height:
|
||||
# points = points + arc_points(x1+r,y1,r,ang+3*deg90,ang+deg90,ang_n)
|
||||
# points = points + arc_points(x2-r,y2,r,ang+1*deg90,ang-deg90,ang_n)
|
||||
# points = points + [xa2+r,ya2]
|
||||
# else:
|
||||
# r = width/2
|
||||
# points = points + arc_points(x1+r,y1+r,r,ang+2*deg90,ang+deg90-deg90,ang_n)
|
||||
# points = points + arc_points(x2-r,y2-r,r,ang+0*deg90,ang-deg90-deg90,ang_n)
|
||||
# ya1=y1+r*sin(ang+deg90)
|
||||
# points = points + [xa1,ya1]
|
||||
else:
|
||||
points = (xa1,ya1,xb1,yb1,xb2,yb2,xa2,ya2,xa1,ya1)
|
||||
polygon(points)
|
||||
|
@ -709,16 +829,32 @@ def gcode_end():
|
|||
#end_data += "%\n"
|
||||
return end_data
|
||||
|
||||
def end(front_poly,back_poly):
|
||||
global gFRONT_DATA, gBACK_DATA, gDRILL_DATA, gEDGE_DATA
|
||||
def end(front_poly,back_poly,front_poly_2pass,back_poly_2pass,front_poly_3pass,back_poly_3pass):
|
||||
global gFRONT_DATA, gBACK_DATA, gFRONT_2PASS_DATA, gBACK_2PASS_DATA, gFRONT_3PASS_DATA, gBACK_3PASS_DATA, gDRILL_DATA, gEDGE_DATA
|
||||
if OUT_FRONT_FILE and front_poly:
|
||||
gFRONT_DATA += polygon2gcode(front_poly,CUT_DEPTH,XY_SPEED, Z_SPEED)
|
||||
gFRONT_DATA += gcode_end()
|
||||
write_file(OUT_DIR,OUT_FRONT_FILE,gFRONT_DATA)
|
||||
if OUT_FRONT_2PASS_FILE and front_poly_2pass:
|
||||
gFRONT_2PASS_DATA += polygon2gcode(front_poly_2pass,CUT_DEPTH,XY_SPEED, Z_SPEED)
|
||||
gFRONT_2PASS_DATA += gcode_end()
|
||||
write_file(OUT_DIR,OUT_FRONT_2PASS_FILE,gFRONT_2PASS_DATA)
|
||||
if OUT_FRONT_3PASS_FILE and front_poly_3pass:
|
||||
gFRONT_3PASS_DATA += polygon2gcode(front_poly_3pass,CUT_DEPTH,XY_SPEED, Z_SPEED)
|
||||
gFRONT_3PASS_DATA += gcode_end()
|
||||
write_file(OUT_DIR,OUT_FRONT_3PASS_FILE,gFRONT_3PASS_DATA)
|
||||
if OUT_BACK_FILE and back_poly:
|
||||
gBACK_DATA += polygon2gcode(back_poly,CUT_DEPTH,XY_SPEED, Z_SPEED)
|
||||
gBACK_DATA += gcode_end()
|
||||
write_file(OUT_DIR,OUT_BACK_FILE,gBACK_DATA)
|
||||
if OUT_BACK_2PASS_FILE and back_poly_2pass:
|
||||
gBACK_2PASS_DATA += polygon2gcode(back_poly_2pass,CUT_DEPTH,XY_SPEED, Z_SPEED)
|
||||
gBACK_2PASS_DATA += gcode_end()
|
||||
write_file(OUT_DIR,OUT_BACK_2PASS_FILE,gBACK_2PASS_DATA)
|
||||
if OUT_BACK_3PASS_FILE and back_poly_3pass:
|
||||
gBACK_3PASS_DATA += polygon2gcode(back_poly_3pass,CUT_DEPTH,XY_SPEED, Z_SPEED)
|
||||
gBACK_3PASS_DATA += gcode_end()
|
||||
write_file(OUT_DIR,OUT_BACK_3PASS_FILE,gBACK_3PASS_DATA)
|
||||
if OUT_DRILL_FILE:
|
||||
gDRILL_DATA += gcode_end()
|
||||
write_file(OUT_DIR,OUT_DRILL_FILE,gDRILL_DATA)
|
||||
|
@ -800,16 +936,16 @@ def arc_points(cx,cy,r,s_angle,e_angle,kaku):
|
|||
float(r)
|
||||
float(cx)
|
||||
float(cy)
|
||||
arc_angle = abs(s_angle-e_angle)
|
||||
|
||||
new_kaku = int( (2.0*pi*float(r))/(arc_angle*float(MM_PER_ARC_SEGMENT)) ) # Automatic resolution (reduces gcode file size)
|
||||
if new_kaku < 8 :
|
||||
new_kaku = 8;
|
||||
elif new_kaku > 100 :
|
||||
new_kaku = 100;
|
||||
|
||||
# arc_angle = abs(s_angle-e_angle)
|
||||
#
|
||||
# new_kaku = int( (2.0*pi*float(r))/(arc_angle*float(MM_PER_ARC_SEGMENT)) ) # Automatic resolution (reduces gcode file size)
|
||||
# if new_kaku < 8 :
|
||||
# new_kaku = 8;
|
||||
# elif new_kaku > 100 :
|
||||
# new_kaku = 100;
|
||||
#
|
||||
# print "Modifying ARC points from",kaku,"to",new_kaku
|
||||
kaku = new_kaku
|
||||
# kaku = new_kaku
|
||||
# print "Arc: Radius:", str(r), "Points:", kaku
|
||||
|
||||
points=[]
|
||||
|
@ -904,7 +1040,7 @@ def mirror_point(x,y):
|
|||
#Drill
|
||||
def read_Drill_file(dirname,drill_file):
|
||||
global gDRILL_D, gDRILL_TYPE, DRILL_UNIT,gUNIT,INCH
|
||||
data = open_file(dirname, drill_file)
|
||||
(data,f) = open_file(dirname, drill_file)
|
||||
print "Read and Parse Drill data"
|
||||
drill_d_unit = DRILL_UNIT
|
||||
for drill in data:
|
||||
|
@ -928,6 +1064,8 @@ def read_Drill_file(dirname,drill_file):
|
|||
if (find(drill, "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";
|
||||
|
@ -1211,7 +1349,7 @@ def drill_hole_test(cx,cy,r):
|
|||
#For edge
|
||||
def readEdgeFile(dirname,edge_file):
|
||||
global gTMP_EDGE_X, gTMP_EDGE_Y, gTMP_EDGE_Z, gEDGE_DATA, gEDGES
|
||||
data = open_file(dirname, edge_file)
|
||||
(data,f) = open_file(dirname, edge_file)
|
||||
|
||||
pre_x = gTMP_EDGE_X
|
||||
pre_y = gTMP_EDGE_Y
|
||||
|
@ -1236,6 +1374,8 @@ def readEdgeFile(dirname,edge_file):
|
|||
elif(dd.group(1) == "2" or dd.group(1) == "02"):
|
||||
pre_x = x
|
||||
pre_y = y
|
||||
f.close()
|
||||
|
||||
def mergeEdge():
|
||||
global gTMP_EDGE_X, gTMP_EDGE_Y, gTMP_EDGE_Z, gEDGE_DATA, gEDGES, MERGINE
|
||||
for edge1 in gEDGES:
|
||||
|
@ -1368,7 +1508,7 @@ def open_file(dirname, filename):
|
|||
return []
|
||||
else:
|
||||
ret = f.read()
|
||||
return ret.split("\n")
|
||||
return (ret.split("\n"),f)
|
||||
def write_file(dirname,filename,datas):
|
||||
file_name = os.path.join(dirname, filename)
|
||||
if(datas):
|
||||
|
|
|
@ -36,15 +36,17 @@ fileName = "printshield" # sys.argv[1]
|
|||
def plotPoints(path_list, color, linewidth): # Thanks to pprzemek (http://stackoverflow.com/questions/2282727/draw-points-using-matplotlib-pyplot-x1-y1-x2-y2)
|
||||
for path in path_list :
|
||||
a = np.array(path) # Give to plot() the points in the adequate format
|
||||
line, = plt.plot(a[:,0], a[:,1], color, linewidth=linewidth*2)
|
||||
line.set_antialiased(False) # turn off antialising
|
||||
line, = plt.plot(a[:,0], a[:,1], color, linewidth=linewidth*3)
|
||||
#line.set_antialiased(False) # turn off antialising
|
||||
|
||||
plt.figure(1)
|
||||
|
||||
drill_diam = 0.8
|
||||
etch_diam = 0.1
|
||||
etch2pass_diam = 0.5
|
||||
etch3pass_diam = 1
|
||||
edge_diam = 2.4
|
||||
linewidth_travel_move = etch_diam/2
|
||||
linewidth_travel_move = etch_diam
|
||||
|
||||
# b: blue
|
||||
# g: green
|
||||
|
@ -56,10 +58,13 @@ linewidth_travel_move = etch_diam/2
|
|||
# w: white
|
||||
|
||||
drill_color = 'r'
|
||||
etch_color = 'g'
|
||||
etch_color = '#00DF00'
|
||||
etch2pass_color = '#00EF00'
|
||||
etch3pass_color = '#00FF00'
|
||||
edge_color = 'b'
|
||||
travel_color = 'c'
|
||||
|
||||
|
||||
plt.subplot(121)
|
||||
plt.hold(True)
|
||||
plt.title("Original Gcode")
|
||||
|
@ -71,6 +76,18 @@ gcode_file = filePath+fileName+"_etch.gcode"
|
|||
plotPoints(etch_moves, etch_color, etch_diam)
|
||||
plotPoints(travel_moves, travel_color, linewidth_travel_move)
|
||||
|
||||
print "\n Loading etch (2nd pass)..."
|
||||
gcode_file = filePath+fileName+"_etch2pass.gcode"
|
||||
(etch_moves, travel_moves, grid_origin, grid_size) = 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)..."
|
||||
gcode_file = filePath+fileName+"_etch3pass.gcode"
|
||||
(etch_moves, travel_moves, grid_origin, grid_size) = gcp.parseGcodeRaw(gcode_file)
|
||||
plotPoints(etch_moves, etch3pass_color, etch3pass_diam)
|
||||
plotPoints(travel_moves, travel_color, linewidth_travel_move)
|
||||
|
||||
print "\n Loading drill..."
|
||||
gcode_file = filePath+fileName+"_drill.gcode"
|
||||
(etch_moves, travel_moves, grid_origin, grid_size) = gcp.parseGcodeRaw(gcode_file)
|
||||
|
@ -84,6 +101,7 @@ plotPoints(etch_moves, edge_color, edge_diam)
|
|||
plotPoints(travel_moves, travel_color, linewidth_travel_move)
|
||||
|
||||
|
||||
|
||||
plt.subplot(122)
|
||||
plt.hold(True)
|
||||
plt.title("Optimized (closest neighbour)")
|
||||
|
@ -96,6 +114,20 @@ gcode_file = filePath+fileName+"_etch.gcode"
|
|||
plotPoints(etch_moves, etch_color, etch_diam)
|
||||
plotPoints(travel_moves, travel_color, linewidth_travel_move)
|
||||
|
||||
print "\n Loading etch (2nd pass)..."
|
||||
gcode_file = filePath+fileName+"_etch2pass.gcode"
|
||||
(etch_moves, travel_moves, grid_origin, grid_size) = 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)..."
|
||||
gcode_file = filePath+fileName+"_etch3pass.gcode"
|
||||
(etch_moves, travel_moves, grid_origin, grid_size) = 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..."
|
||||
gcode_file = filePath+fileName+"_drill.gcode"
|
||||
(etch_moves, travel_moves, grid_origin, grid_size) = gcp.parseGcodeRaw(gcode_file)
|
||||
|
|
Loading…
Reference in New Issue