Exemplo n.º 1
0
    def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize):
        ''' Reimplements Qwt5.QwtLinearScaleEngine.divideScale
        
        **Important**: The stepSize parameter is **ignored**.
        
        :return: (Qwt5.QwtScaleDiv) a scale division whose ticks are aligned with
                 the natural time units '''

        interval = Qwt5.QwtDoubleInterval(x1, x2).normalized()
        if interval.width() <= 0:
            return Qwt5.QwtScaleDiv()

        #dt1=datetime.fromtimestamp(interval.minValue())
        #dt2=datetime.fromtimestamp(interval.maxValue())

        #if dt1.year<1900 or dt2.year>9999 : #limits in time.mktime and datetime
        #    return Qwt5.QwtScaleDiv()

        i1 = int(x1)
        i2 = int(x2)
        medticks = []
        minticks = []

        # major ticks
        if x2 > x1 + 15.01:  # if greater than two weeks
            i1 += (3 - (i1 % 7))
            majticks = [float(i) for i in range(i1, i2, 7)]
        elif x2 > x1 + 1.01:  # if greater than a day
            majticks = [float(i) for i in range(i1, i2 + 1)]
        else:  # if less than a day
            majticks = [float(i1)]
            for i in range(i1, i2 + 1):
                majticks.extend(self.dayrange + float(i))

        i1 = int(x1)
        i2 = int(x2)
        # minor ticks
        if x2 > x1 + 30.01:  # if greater than a month(ish)
            i1 += (3 - (i1 % 7))
            minticks = [float(i) for i in range(i1, i2, 7)]
        elif x2 > x1 + 1.01:  # if greater than a day
            minticks = [float(i) for i in range(i1, i2 + 1)]

        # make sure to comply with maxMajTicks
        L = len(majticks)
        if L > maxMajSteps:
            majticks = majticks[::int(np.ceil(float(L) / maxMajSteps))]

        scaleDiv = Qwt5.QwtScaleDiv(interval, minticks, medticks, majticks)
        #self.scaleDraw().setDatetimeLabelFormat(format)
        if x1 > x2:
            scaleDiv.invert()
        return scaleDiv
Exemplo n.º 2
0
 def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize):
     ''' Reimplements Qwt5.QwtLinearScaleEngine.divideScale
             
     :return: (Qwt5.QwtScaleDiv) a scale division whose ticks are aligned with
              the natural delta time units '''
     interval = Qwt5.QwtDoubleInterval(x1, x2).normalized()
     if interval.width() <= 0:
         return Qwt5.QwtScaleDiv()
     d_range = interval.width()
     if d_range < 2:  # 2s
         return Qwt5.QwtLinearScaleEngine.divideScale(
             self, x1, x2, maxMajSteps, maxMinSteps, stepSize)
     elif d_range < 20:  # 20 s
         s = 1
     elif d_range < 120:  # =60s*2 = 2 minutes
         s = 10
     elif d_range < 1200:  # 60s*20 =20 minutes
         s = 60
     elif d_range < 7200:  # 3600s*2 = 2 hours
         s = 600
     elif d_range < 172800:  # 3600s24*2 = 2 days
         s = 3600
     else:
         s = 86400  #1 day
     #calculate a step size that respects the base step (s) and also enforces the maxMajSteps
     stepSize = s * int(np.ceil(float(d_range // s) / maxMajSteps))
     return Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps,
                                                  maxMinSteps, stepSize)
Exemplo n.º 3
0
 def setScale(self, scale):
     ''' Change the display scaling
     @param scale: new scale value in µV/Div
     '''
     self.scale = scale
     ticks = np.arange(0.0, scale * 11.0, scale).tolist()
     yScaleDiv = Qwt.QwtScaleDiv(0.0, scale * 10.0, [], ticks, [])
     self.plotscale.setScaleDiv(yScaleDiv)
     self.replot()
Exemplo n.º 4
0
    def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize):
        interval = Qwt.QwtDoubleInterval(x1, x2).normalized()
        interval = interval.limited(LOG2_MIN, LOG2_MAX)

        if interval.width() <= 0:
            return Qwt.QwtScaleDiv()

        base = 2.
        if interval.maxValue() / interval.minValue() < base:
            # scale width is less than one octave -> build linear scale

            linearScaler = Qwt.QwtLinearScaleEngine()
            linearScaler.setAttributes(self.attributes())
            linearScaler.setReference(self.reference())
            linearScaler.setMargins(self.lowerMargin(), self.upperMargin())

            return linearScaler.divideScale(x1, x2, maxMajSteps, maxMinSteps,
                                            stepSize)

        stepSize = abs(stepSize)

        if stepSize == 0.:
            if maxMajSteps < 1:
                maxMajSteps = 1

            stepSize = self.divideInterval(
                self.log2(interval).width(), maxMajSteps)

            if stepSize < 1.:
                stepSize = 1.  # major step must be >= 1 decade

        scaleDiv = Qwt.QwtScaleDiv()

        if stepSize <> 0.:
            ticks = self.buildTicks(interval, stepSize, maxMinSteps)
            scaleDiv = Qwt.QwtScaleDiv(interval, ticks[0], ticks[1], ticks[2])

        if x1 > x2:
            scaleDiv.invert()

        return scaleDiv
Exemplo n.º 5
0
 def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize=0.0):
     div = Qwt5.QwtScaleDiv(x1, x2, self._positions, [], [])
     div.setTicks(Qwt5.QwtScaleDiv.MajorTick, self._positions)
     return div
Exemplo n.º 6
0
    def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize):
        ''' Reimplements Qwt5.QwtLinearScaleEngine.divideScale
        
        **Important**: The stepSize parameter is **ignored**.
        
        :return: (Qwt5.QwtScaleDiv) a scale division whose ticks are aligned with
                 the natural time units '''

        #if stepSize != 0:
        #    scaleDiv = Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize)
        #    scaleDiv.datetimeLabelFormat = "%Y/%m/%d %H:%M%S.%f"
        #    return scaleDiv

        interval = Qwt5.QwtDoubleInterval(x1, x2).normalized()
        if interval.width() <= 0:
            return Qwt5.QwtScaleDiv()

        dt1 = datetime.fromtimestamp(interval.minValue())
        dt2 = datetime.fromtimestamp(interval.maxValue())

        if dt1.year < 1900 or dt2.year > 9999:  #limits in time.mktime and datetime
            return Qwt5.QwtScaleDiv()

        majticks = []
        medticks = []
        minticks = []

        dx = interval.width()

        #if dx > 63072001: # = 3600s*24*(365+366) = 2 years (counting a leap year)
        #    format = "%Y"
        #    for y in range(dt1.year+1,dt2.year):
        #        dt = datetime(year=y, month=1, day=1)
        #        majticks.append(mktime(dt.timetuple()))

        #elif dx > 5270400: # = 3600s*24*61 = 61 days
        #    format = "%Y %b"
        #    d = timedelta(days=31)
        #    dt = dt1.replace(day=1, hour=0, minute=0, second=0, microsecond=0)+d
        #    while(dt<dt2):
        #        dt = dt.replace(day=1) #make sure that we are on day 1 (even if always sum 31 days)
        #        majticks.append(mktime(dt.timetuple()))
        #        dt += d

        #elif dx > 172800: # 3600s24*2 = 2 days

        # put this back in
        if dx > 86400:  # 1 day
            format = "%m-%d %H:%M"
            d = timedelta(hours=1)
            dt = dt1.replace(hour=0, minute=0, second=0, microsecond=0) + d
            while (dt < dt2):
                if dt.hour >= 9 and dt.hour <= 16:
                    majticks.append(mktime(dt.timetuple()))
                dt += d

        #elif dx > 7200: # 3600s*2 = 2hours
        #    format = "%b/%d-%Hh"
        #    d = timedelta(hours=1)
        #    dt = dt1.replace(minute=0, second=0, microsecond=0) + d
        #    while(dt<dt2):
        #        majticks.append(mktime(dt.timetuple()))
        #        dt += d

        #elif dx > 1200: # 60s*20 =20 minutes
        #    format = "%H:%M"
        #    d = timedelta(minutes=10)
        #    dt = dt1.replace(minute=(dt1.minute//10)*10, second=0, microsecond=0) + d
        #    while(dt<dt2):
        #        majticks.append(mktime(dt.timetuple()))
        #        dt += d

        #elif dx > 120: # =60s*2 = 2 minutes
        else:
            format = "%H:%M"
            d = timedelta(hours=1)
            dt = dt1.replace(minute=0, second=0, microsecond=0) + d
            while (dt < dt2):
                majticks.append(mktime(dt.timetuple()))
                dt += d

        #elif dx > 20: # 20 s
        #    format = "%H:%M:%S"
        #    d = timedelta(seconds=10)
        #    dt = dt1.replace(second=(dt1.second//10)*10, microsecond=0) + d
        #    while(dt<dt2):
        #        majticks.append(mktime(dt.timetuple()))
        #        dt += d

        #elif dx > 2: # 2s
        #    format = "%H:%M:%S"
        #    majticks=range(int(x1)+1, int(x2))

        #else: #less than 2s (show microseconds)
        #    scaleDiv = Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize)
        #    self.scaleDraw().setDatetimeLabelFormat("%S.%f")
        #    return scaleDiv

        #make sure to comply with maxMajTicks
        L = len(majticks)
        if L > maxMajSteps:
            majticks = majticks[::int(np.ceil(float(L) / maxMajSteps))]

        scaleDiv = Qwt5.QwtScaleDiv(interval, minticks, medticks, majticks)
        self.scaleDraw().setDatetimeLabelFormat(format)
        if x1 > x2:
            scaleDiv.invert()

        ##START DEBUG
        #print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
        #for tk in  scaleDiv.ticks(scaleDiv.MajorTick):
        #    print datetime.fromtimestamp(tk).isoformat()
        #print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
        ##END DEBUG

        return scaleDiv