################################################################################
# nc_read.py
#
# Base class for NC code parsing
#
# Hirutso Enni, 2009-01-13
################################################################################
class Parser:
    def __init__(self):
        self.currentx = 0.0
        self.currenty = 0.0
        self.currentz = 0.0
        self.absolute_flag = True
    ############################################################################
    # Internals
    def files_open(self, name, oname=None):
        if (oname == None):
            oname = (name+'.nc.xml')
        self.file_in = open(name, 'r')
        self.file_out = open(oname, 'w')
        self.file_out.write('\n')
        self.file_out.write('\n')
    def files_close(self):
        self.file_out.write('\n')
        self.file_in.close()
        self.file_out.close()
    def readline(self):
        self.line = self.file_in.readline().rstrip()
        if (len(self.line)):
            return True
        else:
            return False
    def write(self, s):
        self.file_out.write(s)
    ############################################################################
    # Xml
    def begin_ncblock(self):
        self.file_out.write('\t\n')
    def end_ncblock(self):
        self.file_out.write('\t\n')
    def add_text(self, s, col=None, cdata=False):
        s.replace('&', '&')
        s.replace('"', '"')
        s.replace('<', '<')
        s.replace('>', '>')
        if (cdata):
            (cd1, cd2) = ('')
        else:
            (cd1, cd2) = ('', '')
        if (col != None):
            self.file_out.write('\t\t'+cd1+s+cd2+'\n')
        else:
            self.file_out.write('\t\t'+cd1+s+cd2+'\n')
    def set_mode(self, units=None):
        self.file_out.write('\t\t\n')
    def set_tool(self, number=None):
        self.file_out.write('\t\t\n')
    def begin_path(self, col=None):
        if (col != None):
            self.file_out.write('\t\t\n')
        else:
            self.file_out.write('\t\t\n')
    def end_path(self):
        self.file_out.write('\t\t\n')
    def add_line(self, x=None, y=None, z=None, a=None, b=None, c=None):
        if (x == None and y == None and z == None and a == None and b == None and c == None):
            return
        self.file_out.write('\t\t\t\n')
    def add_lathe_increment_line(self, u=None,  w=None):
        # needed for representing U and W moves in lathe code- these are non modal incremental moves
        # U == X and W == Z
        if (u == None and w == None):
            return
        self.file_out.write('\t\t\t\n')
    def add_arc(self, x=None, y=None, z=None, i=None, j=None, k=None, r=None, d=None):
        if (x == None and y == None and z == None and i == None and j == None and k == None and r == None and d == None):
            return
        self.file_out.write('\t\t\t\n')
    def incremental(self):
        self.absolute_flag = False
    def absolute(self):
        self.absolute_flag = True