'Seek to a position ( tuple (x, y, z) ) with speed (0-255) and and wait until arrival (boolean)
Seek will automatically select between a standard seek and a syncronised seek when it is required
When waitArrival is True, funtion does not return until all seeks are compete'

def seek(self, pos, speed=None, waitArrival=True, units=None):

    if (speed == None):
        speed = self.speed
        if (speed == None):
            raise _RepRapError('Cartesian    speed    not    set    or    specified')
    if (units == None):
        units = self.units
        if (units == None):
            units = UNITS_STEPS
    (curX, curY, curZ) = (self.x.getPos(), self.y.getPos(), self.z.getPos())
    (x, y, z) = pos
    if (((x == None) or (x <= self.x.limit) or (self.x.limit == 0)) and ((y == None) or (y <= self.y.limit) or (self.y.limit == 0)) and ((z == None) or (z <= self.z.limit) or (self.z.limit == 0))):
        if printDebug:
            print 'seek    from    [', curX, curY, curZ, ']    to    [', x, y, z, ']'
        if ((x == curX) or (y == curY) or (x == None) or (y == None)):
            if printDebug:
                print '                standard    seek'
            if ((x != None) and (x != curX)):
                self.x.seek(x, speed, waitArrival, units)
            if ((y != None) and (y != curY)):
                self.y.seek(y, speed, waitArrival, units)
        elif ((x != None) and (y != None)):
            if printDebug:
                print '                sync    seek'
            self._syncSeek(pos, curX, curY, speed, waitArrival, units)
        if ((z != None) and (z != curZ)):
            self.z.seek(z, speed, waitArrival, units)
        return True
    else:
        print 'Trying    to    print    outside    of    limit,    aborting    seek'
        return False
