import os import numpy import time, datetime import mpldriver import Queue import threading def isRealtime(utcdatatime): utcnow = time.mktime(time.localtime()) delta = abs(utcnow - utcdatatime) # abs if delta >= 30.: return False return True class Figure: __driver = mpldriver __isConfigThread = False fig = None id = None wintitle = None width = None height = None nplots = None timerange = None axesObjList = [] WIDTH = None HEIGHT = None PREFIX = 'fig' xmin = None xmax = None counter_imagwr = 0 figfile = None def __init__(self): raise ValueError, "This method is not implemented" def __del__(self): self.__driver.closeFigure(True) def getFilename(self, name, ext='.png'): path = '%s%03d' %(self.PREFIX, self.id) filename = '%s_%s%s' %(self.PREFIX, name, ext) return os.path.join(path, filename) def getAxesObjList(self): return self.axesObjList def getSubplots(self): raise ValueError, "Abstract method: This method should be defined" def getScreenDim(self, widthplot, heightplot): nrow, ncol = self.getSubplots() widthscreen = widthplot*ncol heightscreen = heightplot*nrow return widthscreen, heightscreen def getTimeLim(self, x, xmin=None, xmax=None, timerange=None): if self.xmin != None and self.xmax != None: if timerange == None: timerange = self.xmax - self.xmin xmin = self.xmin + timerange xmax = self.xmax + timerange return xmin, xmax if timerange == None and (xmin==None or xmax==None): raise ValueError, "timerange or xmin+xmax should be defined" if timerange != None: txmin = x[0] - x[0] % min(timerange/10, 10*60) else: txmin = x[0] - x[0] % 10*60 thisdatetime = datetime.datetime.utcfromtimestamp(txmin) thisdate = datetime.datetime.combine(thisdatetime.date(), datetime.time(0,0,0)) if timerange != None: xmin = (thisdatetime - thisdate).seconds/(60*60.) xmax = xmin + timerange/(60*60.) mindt = thisdate + datetime.timedelta(hours=xmin) - datetime.timedelta(seconds=time.timezone) xmin_sec = time.mktime(mindt.timetuple()) maxdt = thisdate + datetime.timedelta(hours=xmax) - datetime.timedelta(seconds=time.timezone) xmax_sec = time.mktime(maxdt.timetuple()) return xmin_sec, xmax_sec # if timerange != None: # txmin = x[0] - x[0]%timerange # else: # txmin = numpy.min(x) # # thisdatetime = datetime.datetime.utcfromtimestamp(txmin) # thisdate = datetime.datetime.combine(thisdatetime.date(), datetime.time(0,0,0)) # # #################################################### # #If the x is out of xrange # if xmax != None: # if xmax < (thisdatetime - thisdate).seconds/(60*60.): # xmin = None # xmax = None # # if xmin == None: # td = thisdatetime - thisdate # xmin = td.seconds/(60*60.) # # if xmax == None: # xmax = xmin + self.timerange/(60*60.) # # mindt = thisdate + datetime.timedelta(hours=xmin) - datetime.timedelta(seconds=time.timezone) # tmin = time.mktime(mindt.timetuple()) # # maxdt = thisdate + datetime.timedelta(hours=xmax) - datetime.timedelta(seconds=time.timezone) # tmax = time.mktime(maxdt.timetuple()) # # #self.timerange = tmax - tmin # # return tmin, tmax def init(self, id, nplots, wintitle): raise ValueError, "This method has been replaced with createFigure" def createFigure(self, id, wintitle, widthplot=None, heightplot=None, show=True): """ Crea la figura de acuerdo al driver y parametros seleccionados seleccionados. Las dimensiones de la pantalla es calculada a partir de los atributos self.WIDTH y self.HEIGHT y el numero de subplots (nrow, ncol) Input: id : Los parametros necesarios son wintitle : """ if widthplot == None: widthplot = self.WIDTH if heightplot == None: heightplot = self.HEIGHT self.id = id self.wintitle = wintitle self.widthscreen, self.heightscreen = self.getScreenDim(widthplot, heightplot) self.fig = self.__driver.createFigure(id=self.id, wintitle=self.wintitle, width=self.widthscreen, height=self.heightscreen, show=show) self.axesObjList = [] self.counter_imagwr = 0 def setDriver(self, driver=mpldriver): self.__driver = driver def setTitle(self, title): self.__driver.setTitle(self.fig, title) def setWinTitle(self, title): self.__driver.setWinTitle(self.fig, title=title) def setTextFromAxes(self, text): raise ValueError, "Este metodo ha sido reemplazaado con el metodo setText de la clase Axes" def makeAxes(self, nrow, ncol, xpos, ypos, colspan, rowspan): raise ValueError, "Este metodo ha sido reemplazaado con el metodo addAxes" def addAxes(self, *args): """ Input: *args : Los parametros necesarios son nrow, ncol, xpos, ypos, colspan, rowspan """ axesObj = Axes(self.fig, *args) self.axesObjList.append(axesObj) def saveFigure(self, figpath, figfile, *args): filename = os.path.join(figpath, figfile) fullpath = os.path.split(filename)[0] if not os.path.exists(fullpath): subpath = os.path.split(fullpath)[0] if not os.path.exists(subpath): os.mkdir(subpath) os.mkdir(fullpath) self.__driver.saveFigure(self.fig, filename, *args) def save(self, figpath, figfile=None, save=True, ftp=False, wr_period=1, thisDatetime=None, update_figfile=True): if not save: return if figfile == None: if not thisDatetime: raise ValueError, "Saving figure: figfile or thisDatetime should be defined" return str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") figfile = self.getFilename(name = str_datetime) if self.figfile == None: self.figfile = figfile if update_figfile: self.figfile = figfile self.counter_imagwr += 1 if self.counter_imagwr= 2*x_median) if len(index[0]) != 0: z_buffer[index[0],::] = self.__missing z_buffer = numpy.ma.masked_inside(z_buffer,0.99*self.__missing,1.01*self.__missing) return x_buffer, y_buffer, z_buffer