# Preliminary backplot support for autocad clone applications # This code modified from iso_read.py and emc2_read.py distriuted with HeeksCAD as of Sep 2010 # Dan Falck 2011/01/06 # """ use this script to backplot nc files to *.scr file for autocad,bricscad, draftsight,progecad,ares commander, etc.... usage: python cad_read.py temp.nc temp.scr """ import cad_iso_read as iso import sys # Override some iso parser methods to interpret arc centers as relative to origin, not relative to start of arc. #def write_layer(name,number): #FILE.write('-LAYER New %s%s \n' %(name,number)) #FILE.write('-LAYER Set %s%s \n' %(name,number)) class CAD_backplot(iso.Parser): def __init__(self): iso.Parser.__init__(self) def Parse(self, name, oname=None): self.files_open(name,oname) #self.begin_ncblock() #self.begin_path(None) #self.add_line(z=500) #self.end_path() #self.end_ncblock() path_col = None f = None arc = 0 # Storage for tool position history of last block processed to properly convert absolute arc centers oldx = -1.0 oldy = 0.0 oldz = 0.0 movelist = [] while (self.readline()): # self.readline returns false if the line is empty - the parsing stops if the line is empty. a = None b = None c = None #f = None i = None j = None k = None p = None q = None r = None s = None x = None y = None z = None iout = None jout = None kout = None tool = 0 #self.begin_ncblock() move = False #arc = 0 #path_col = None drill = False no_move = False words = self.pattern_main.findall(self.line) for word in words: col = None cdata = False if (word[0] == 'A' or word[0] == 'a'): col = "axis" a = eval(word[1:]) move = True elif (word[0] == 'B' or word[0] == 'b'): col = "axis" b = eval(word[1:]) move = True elif (word[0] == 'C' or word[0] == 'c'): col = "axis" c = eval(word[1:]) move = True elif (word[0] == 'F' or word[0] == 'f'): col = "axis" f = eval(word[1:]) move = True elif (word == 'G0' or word == 'G00' or word == 'g0' or word == 'g00'): ##FILE.write('-color Magenta\n') path_col = "rapid" col = "rapid" arc = 0 elif (word == 'G1' or word == 'G01' or word == 'g1' or word == 'g01'): ##FILE.write('-color Green\n') path_col = "feed" col = "feed" arc = 0 elif (word == 'G2' or word == 'G02' or word == 'g2' or word == 'g02' or word == 'G12' or word == 'g12'): ##FILE.write('-color Green\n') path_col = "feed" col = "feed" arc = -1 elif (word == 'G3' or word == 'G03' or word == 'g3' or word == 'g03' or word == 'G13' or word == 'g13'): ##FILE.write('-color Green\n') path_col = "feed" col = "feed" arc = +1 elif (word == 'G10' or word == 'g10'): no_move = True elif (word == 'L1' or word == 'l1'): no_move = True elif (word == 'G20' or word == 'G70'): col = "prep" self.set_mode(units=25.4) elif (word == 'G21' or word == 'G71'): col = "prep" self.set_mode(units=1.0) # Note: Anilam has very non standard params for drill cycles. Not Yet implemented! elif (word == 'G81' or word == 'g81'): drill = True no_move = True path_col = "feed" col = "feed" elif (word == 'G82' or word == 'g82'): drill = True; no_move = True path_col = "feed" col = "feed" elif (word == 'G83' or word == 'g83'): drill = True no_move = True path_col = "feed" col = "feed" elif (word[0] == 'G') : col = "prep" elif (word[0] == 'I' or word[0] == 'i'): col = "axis" i = eval(word[1:]) move = True elif (word[0] == 'J' or word[0] == 'j'): col = "axis" j = eval(word[1:]) move = True elif (word[0] == 'K' or word[0] == 'k'): col = "axis" k = eval(word[1:]) move = True elif (word[0] == 'M') : col = "misc" elif (word[0] == 'N') : col = "blocknum" elif (word[0] == 'O') : col = "program" elif (word[0] == 'P' or word[0] == 'p'): col = "axis" p = eval(word[1:]) move = True elif (word[0] == 'Q' or word[0] == 'q'): col = "axis" q = eval(word[1:]) move = True elif (word[0] == 'R' or word[0] == 'r'): col = "axis" r = eval(word[1:]) move = True elif (word[0] == 'S' or word[0] == 's'): col = "axis" s = eval(word[1:]) move = True elif (word[0] == 'T') : col = "tool" self.set_tool( eval(word[1:]) ) tool = eval(word[1:]) elif (word[0] == 'X' or word[0] == 'x'): col = "axis" x = eval(word[1:]) move = True elif (word[0] == 'Y' or word[0] == 'y'): col = "axis" y = eval(word[1:]) move = True elif (word[0] == 'Z' or word[0] == 'z'): col = "axis" z = eval(word[1:]) move = True elif (word[0] == '(') : (col, cdata) = ("comment", True) elif (word[0] == '!') : (col, cdata) = ("comment", True) elif (word[0] == ';') : (col, cdata) = ("comment", True) elif (word[0] == '#') : col = "variable" elif (word[0] == ':') : col = "blocknum" elif (ord(word[0]) <= 32) : cdata = True #self.add_text(word, col, cdata) if (drill): self.begin_path("rapid") self.add_line(x, y, r) self.end_path() self.begin_path("feed") self.add_line(x, y, z) self.end_path() self.begin_path("feed") self.add_line(x, y, r) self.end_path() #elif (tool): #write_layer('T',tool) else: if (move and not no_move): self.begin_path(path_col) #use absolute arc centers for IJK params. # Subtract old XYZ off to get relative centers as expected: #if path_col == 'rapid': #FILE.write('-color Red\n') #else: #FILE.write('-color Green\n') if (arc) : z = oldz if (x != None) and (oldx != None) and (i != None): iout = i if (y != None) and (oldy != None) and (j != None): jout = j if (z != None) and (oldz != None) and (k != None): kout = k self.add_arc(x, y, z, iout, jout, kout, r, arc) #if (arc == -1): ##FILE.write('arc %s,%s,%s\n' %(x,y,z)) ##FILE.write('c\n') ##FILE.write('%s,%s,%s\n' %(oldx+i,oldy+j,oldz)) ##FILE.write('%s,%s,%s\n' %(oldx,oldy,z)) #else: ##FILE.write('arc %s,%s,%s\n' %(oldx,oldy,z)) ##FILE.write('c\n') ##FILE.write('%s,%s,%s\n' %(oldx+i,oldy+j,oldz)) ##FILE.write('%s,%s,%s\n' %(x,y,z)) else: self.add_line(x, y, z, a, b, c) if (x == None) : x = oldx if (y == None) : y = oldy if (z == None) : z = oldz scr_line = ('line %s,%s,%s %s,%s,%s \n' %(oldx,oldy,oldz,x,y,z)) #print scr_line ##FILE.write(scr_line) self.end_path() if (x != None) : oldx = x if (y != None) : oldy = y if (z != None) : oldz = z #oldx = x #oldy = y #oldz = z self.end_ncblock() self.files_close() #FILE.write('\n') #FILE.close() ################################################################################ if __name__ == '__main__': parser = CAD_backplot() if len(sys.argv)>2: parser.Parse(sys.argv[1],sys.argv[2]) else: parser.Parse(sys.argv[1])