def align(self, interval, stepSize): """ Align an interval to a step size The limits of an interval are aligned that both are integer multiples of the step size. :param qwt.interval.QwtInterval interval: Interval :param float stepSize: Step size :return: Aligned interval """ x1 = interval.minValue() x2 = interval.maxValue() eps = 0.000000000001 if -DBL_MAX + stepSize <= x1: x = floorEps(x1, stepSize) if abs(x) <= eps or not qFuzzyCompare(x1, x): x1 = x if DBL_MAX - stepSize >= x2: x = ceilEps(x2, stepSize) if abs(x) <= eps or not qFuzzyCompare(x2, x): x2 = x return QwtInterval(x1, x2)
def qwtFuzzyLessOrEqual(d1, d2): return (d1 <= d2) or qFuzzyCompare(d1, d2)
def qwtFuzzyGreaterOrEqual(d1, d2): return (d1 >= d2) or qFuzzyCompare(d1, d2)
def buildMinorTicks(self, ticks, maxMinorSteps, stepSize): """ Calculate minor ticks for an interval :param list ticks: Major ticks (returned) :param int maxMinorSteps: Maximum number of minor steps :param float stepSize: Step size """ logBase = self.base() if stepSize < 1.1: minStep = self.divideInterval(stepSize, maxMinorSteps + 1) if minStep == 0.0: return numSteps = int(round(stepSize / minStep)) mediumTickIndex = -1 if numSteps > 2 and numSteps % 2 == 0: mediumTickIndex = numSteps / 2 for v in ticks[QwtScaleDiv.MajorTick]: s = logBase / numSteps if s >= 1.0: if not qFuzzyCompare(s, 1.0): ticks[QwtScaleDiv.MinorTick] += [v * s] for j in range(2, numSteps): ticks[QwtScaleDiv.MinorTick] += [v * j * s] else: for j in range(1, numSteps): tick = v + j * v * (logBase - 1) / numSteps if j == mediumTickIndex: ticks[QwtScaleDiv.MediumTick] += [tick] else: ticks[QwtScaleDiv.MinorTick] += [tick] else: minStep = self.divideInterval(stepSize, maxMinorSteps) if minStep == 0.0: return if minStep < 1.0: minStep = 1.0 numTicks = int(round(stepSize / minStep)) - 1 if qwtFuzzyCompare( (numTicks + 1) * minStep, stepSize, stepSize) > 0: numTicks = 0 if numTicks < 1: return mediumTickIndex = -1 if numTicks > 2 and numTicks % 2: mediumTickIndex = numTicks / 2 minFactor = max([math.pow(logBase, minStep), float(logBase)]) for tick in ticks[QwtScaleDiv.MajorTick]: for j in range(numTicks): tick *= minFactor if j == mediumTickIndex: ticks[QwtScaleDiv.MediumTick] += [tick] else: ticks[QwtScaleDiv.MinorTick] += [tick]
def minLabelDist(self, font): """ Determine the minimum distance between two labels, that is necessary that the texts don't overlap. :param QFont font: Font :return: The maximum width of a label .. seealso:: :py:meth:`getBorderDistHint()` """ if not self.hasComponent(QwtAbstractScaleDraw.Labels): return 0 ticks = self.scaleDiv().ticks(QwtScaleDiv.MajorTick) if not ticks: return 0 fm = QFontMetrics(font) vertical = self.orientation() == Qt.Vertical bRect1 = QRectF() bRect2 = self.labelRect(font, ticks[0]) if vertical: bRect2.setRect(-bRect2.bottom(), 0.0, bRect2.height(), bRect2.width()) maxDist = 0.0 for tick in ticks: bRect1 = bRect2 bRect2 = self.labelRect(font, tick) if vertical: bRect2.setRect(-bRect2.bottom(), 0.0, bRect2.height(), bRect2.width()) dist = fm.leading() if bRect1.right() > 0: dist += bRect1.right() if bRect2.left() < 0: dist += -bRect2.left() if dist > maxDist: maxDist = dist angle = qwtRadians(self.labelRotation()) if vertical: angle += math.pi / 2 sinA = math.sin(angle) if qFuzzyCompare(sinA + 1.0, 1.0): return math.ceil(maxDist) fmHeight = fm.ascent() - 2 labelDist = fmHeight / math.sin(angle) * math.cos(angle) if labelDist < 0: labelDist = -labelDist if labelDist > maxDist: labelDist = maxDist if labelDist < fmHeight: labelDist = fmHeight return math.ceil(labelDist)