Exemplo n.º 1
0
QDebug operator<<( QDebug debug, const QwtScaleDiv &scaleDiv )
{
    debug << scaleDiv.lowerBound() << "<->" << scaleDiv.upperBound();
    debug << "Major: " << scaleDiv.ticks( QwtScaleDiv::MajorTick );
    debug << "Medium: " << scaleDiv.ticks( QwtScaleDiv::MediumTick );
    debug << "Minor: " << scaleDiv.ticks( QwtScaleDiv::MinorTick );

    return debug;
}
Exemplo n.º 2
0
void ScaleDraw::drawTick(QPainter *p, double value, int len) const
{
	int axis = this->axis();
	ScaleEngine *sc_engine = (ScaleEngine *)d_plot->axisScaleEngine(axis);
	if (sc_engine->hasBreak()){
		double dlb = sc_engine->axisBreakLeft();
		double drb = sc_engine->axisBreakRight();
		if ((dlb < value && drb > value) ||
			((axis == QwtPlot::yLeft || axis == QwtPlot::xBottom) && value == dlb) ||
			((axis == QwtPlot::yRight || axis == QwtPlot::xTop) && value == drb) ||
			(sc_engine->testAttribute(QwtScaleEngine::Inverted) && (value == dlb || value == drb)))
			return;

		if (d_plot->isPrinting()){
			QwtScaleMap scaleMap = map();
			double val = scaleMap.transform(value);
			if (val >= scaleMap.transform(dlb) && val <= scaleMap.transform(drb))
				return;
		}
	}

	QwtScaleDiv scDiv = scaleDiv();
	QwtValueList majTicks = scDiv.ticks(QwtScaleDiv::MajorTick);
	if (majTicks.contains(value)){
		if (d_majTicks == In || d_majTicks == None)
			return;

		switch (d_show_ticks_policy){
			case ShowAll:
			break;

			case HideBegin:
				if (majTicks.first() == value)
					return;
			break;
			case HideEnd:
				if (majTicks.last() == value)
					return;
			break;
			case HideBeginEnd:
				if (majTicks.first() == value || majTicks.last() == value)
					return;
			break;
		}
	}

    QwtValueList medTicks = scDiv.ticks(QwtScaleDiv::MediumTick);
    if (medTicks.contains(value) && (d_minTicks == In || d_minTicks == None))
        return;

    QwtValueList minTicks = scDiv.ticks(QwtScaleDiv::MinorTick);
    if (minTicks.contains(value) && (d_minTicks == In || d_minTicks == None))
        return;

	QwtScaleDraw::drawTick(p, value, len);
}
Exemplo n.º 3
0
    virtual void updateScaleDiv( const QwtScaleDiv &xMap,
        const QwtScaleDiv &yMap )
    {
        QList<double> ticks[QwtScaleDiv::NTickTypes];

        ticks[QwtScaleDiv::MajorTick] =
            xMap.ticks( QwtScaleDiv::MediumTick );
        ticks[QwtScaleDiv::MinorTick] =
            xMap.ticks( QwtScaleDiv::MinorTick );

        QwtPlotGrid::updateScaleDiv(
            QwtScaleDiv( xMap.lowerBound(), xMap.upperBound(), ticks ),
            yMap );
    }
Exemplo n.º 4
0
vector<double> AxisImp::getMinorTickLocations() const
{
    vector<double> minorTicks;
    QwtScaleDiv scaleDiv = mScaleDraw.scaleDiv();

    QwtValueList minorTickList = scaleDiv.ticks(QwtScaleDiv::MinorTick) + scaleDiv.ticks(QwtScaleDiv::MediumTick);
    for (int i = 0; i < minorTickList.size(); ++i)
    {
        double dValue = minorTickList[i];
        minorTicks.push_back(dValue);
    }

    return minorTicks;
}
void OscilloscopePlot::incrementInterval()
{
    d_interval = QwtInterval( d_interval.maxValue(),
        d_interval.maxValue() + d_interval.width() );

    CurveData *data = static_cast<CurveData *>( d_curve->data() );
    data->values().clearStaleValues( d_interval.minValue() );

    // To avoid, that the grid is jumping, we disable
    // the autocalculation of the ticks and shift them
    // manually instead.

    QwtScaleDiv scaleDiv = axisScaleDiv( QwtPlot::xBottom );
    scaleDiv.setInterval( d_interval );

    for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ )
    {
        QList<double> ticks = scaleDiv.ticks( i );
        for ( int j = 0; j < ticks.size(); j++ )
            ticks[j] += d_interval.width();
        scaleDiv.setTicks( i, ticks );
    }
    setAxisScaleDiv( QwtPlot::xBottom, scaleDiv );

    d_origin->setValue( d_interval.minValue() + d_interval.width() / 2.0, 0.0 );

    d_paintedPoints = 0;
    replot();
}
Exemplo n.º 6
0
Knob::Knob(const QString &title, double min, double max, QWidget *parent):
    QWidget(parent)
{
  QFont font("Helvetica", 10);

  d_knob = new QwtKnob(this);
  d_knob->setFont(font);
  d_knob->setRange(min, max);

  QwtScaleDiv scaleDiv =
      d_knob->scaleEngine()->divideScale(min, max, 5, 3);
  QList<double> ticks = scaleDiv.ticks(QwtScaleDiv::MajorTick);
  if ( ticks.size() > 0 && ticks[0] > min )
  {
      if ( ticks.first() > min )
          ticks.prepend(min);
      if ( ticks.last() < max )
          ticks.append(max);
  }
  scaleDiv.setTicks(QwtScaleDiv::MajorTick, ticks);
  d_knob->setScale(scaleDiv);

  d_knob->setKnobWidth(50);

  font.setBold(true);
  d_label = new QLabel(title, this);
  d_label->setFont(font);
  d_label->setAlignment(Qt::AlignTop | Qt::AlignHCenter);

  setSizePolicy(QSizePolicy::MinimumExpanding,
      QSizePolicy::MinimumExpanding);

  connect(d_knob, SIGNAL(valueChanged(double)),
      this, SIGNAL(valueChanged(double)));
}
Exemplo n.º 7
0
void Plot::incrementInterval()
{
    d_interval = QwtInterval(d_interval.maxValue(),
        d_interval.maxValue() + d_interval.width());

    CurveData *data0 = static_cast<CurveData *>( d_curve0->data() );
    CurveData *data1 = static_cast<CurveData *>( d_curve1->data() );
    data0->clearStaleVal(d_interval.minValue());
    data1->clearStaleVal(d_interval.minValue());

    QwtScaleDiv scaleDiv = *axisScaleDiv(QwtPlot::xBottom);
    scaleDiv.setInterval(d_interval);

    for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ )
    {
        QList<double> ticks = scaleDiv.ticks(i);
        for ( int j = 0; j < ticks.size(); j++ )
            ticks[j] += d_interval.width();
        scaleDiv.setTicks(i, ticks);
    }
    setAxisScaleDiv(QwtPlot::xBottom, scaleDiv);

    d_origin->setValue(d_interval.minValue() + d_interval.width() / 2.0, 0.0);

    d_paintedPoints0 = 0;
    d_paintedPoints1 = 0;
    replot();
}
Exemplo n.º 8
0
QVector<double> qwtTickList( const QwtScaleDiv &scaleDiv )
{
    QVector<double> values;

    double lowerLimit = scaleDiv.interval().minValue();
    double upperLimit = scaleDiv.interval().maxValue();

    if ( upperLimit < lowerLimit )
        qSwap( lowerLimit, upperLimit );

    values += lowerLimit;

    for ( int tickType = QwtScaleDiv::MinorTick;
        tickType < QwtScaleDiv::NTickTypes; tickType++ )
    {
        const QList<double> ticks = scaleDiv.ticks( tickType );

        for ( int i = 0; i < ticks.count(); i++ )
        {
            const double v = ticks[i];
            if ( v > lowerLimit && v < upperLimit )
                values += v;
        }       
    }   

    values += upperLimit;
    
    return values;
}
Exemplo n.º 9
0
void ScaleDraw::drawTick(QPainter *p, double value, int len) const
{
    QwtScaleDiv scDiv = scaleDiv();
    QwtValueList majTicks = scDiv.ticks(QwtScaleDiv::MajorTick);
    if (majTicks.contains(value) && (d_majTicks == In || d_majTicks == None))
        return;

    QwtValueList medTicks = scDiv.ticks(QwtScaleDiv::MediumTick);
    if (medTicks.contains(value) && (d_minTicks == In || d_minTicks == None))
        return;

    QwtValueList minTicks = scDiv.ticks(QwtScaleDiv::MinorTick);
    if (minTicks.contains(value) && (d_minTicks == In || d_minTicks == None))
        return;

    QwtScaleDraw::drawTick(p, value, len);
}
Exemplo n.º 10
0
QwtText QwtTextScaleDraw::label(double value) const
{
    const QwtScaleDiv scDiv = scaleDiv();
    if (!scDiv.contains (value))
        return QwtText();

    QwtValueList lst = scDiv.ticks (QwtScaleDiv::MajorTick);
    lst.pop_front();
    lst.pop_back();
    int index = lst.indexOf(value);
    if (index >= 0 && index < (int)labels.count())
        return QwtText(labels[index]);
    else
        return QwtText();
}
Exemplo n.º 11
0
KnobSpin::KnobSpin(const QString &title, double min, double max, double step, QWidget *parent):
    QWidget(parent)
{
  QFont font("Helvetica", 10);

  knob_ = new QwtKnob(this);
  knob_->setFont(font);
  knob_->setRange(min, max);
  QwtScaleDiv scaleDiv =
      knob_->scaleEngine()->divideScale(min, max, 5, 3);
  QList<double> ticks = scaleDiv.ticks(QwtScaleDiv::MajorTick);
  if ( ticks.size() > 0 && ticks[0] > min )
  {
      if ( ticks.first() > min )
          ticks.prepend(min);
      if ( ticks.last() < max )
          ticks.append(max);
  }
  scaleDiv.setTicks(QwtScaleDiv::MajorTick, ticks);
  knob_->setScale(scaleDiv);

  knob_->setKnobWidth(150);
  knob_->setStep(step);

  spin_ = new QDoubleSpinBox(this);
  spin_->setRange(min, max);
  spin_->setSingleStep(step);

  font.setBold(true);
  label_ = new QLabel(title, this);
  label_->setFont(font);
  label_->setAlignment(Qt::AlignTop | Qt::AlignHCenter);

  setSizePolicy(QSizePolicy::MinimumExpanding,
      QSizePolicy::MinimumExpanding);

  connect(spin_, SIGNAL(valueChanged(double)),
          this, SIGNAL(valueChanged(double)));

  connect(knob_, SIGNAL(valueChanged(double)),
          spin_, SLOT(setValue(double)) );
  connect(spin_, SIGNAL(valueChanged(double)),
          knob_, SLOT(setValue(double)) );
}
Exemplo n.º 12
0
void Plot::setTransformation( QwtTransform *transform )
{
    QwtLinearScaleEngine *scaleEngine = new QwtLinearScaleEngine();
    scaleEngine->setTransformation( transform );

    setAxisScaleEngine( QwtAxis::xBottom, scaleEngine );

    // we have to reassign the axis settinge, because they are
    // invalidated, when the scale engine has changed

    QwtScaleDiv scaleDiv =
        axisScaleEngine( QwtAxis::xBottom )->divideScale( 10.0, 1000.0, 8, 10 );

    QList<double> ticks;
    ticks += 10.0;
    ticks += scaleDiv.ticks( QwtScaleDiv::MajorTick );
    scaleDiv.setTicks( QwtScaleDiv::MajorTick, ticks );

    setAxisScaleDiv( QwtAxis::xBottom, scaleDiv );

    replot();
}
Exemplo n.º 13
0
/**
  * Set the scale of the horizontal axis
  * @param from :: Minimum value
  * @param to :: Maximum value
  */
void OneCurvePlot::setXScale(double from, double to)
{
  QFontMetrics fm(axisFont(QwtPlot::xBottom));
  int n = from != 0.0 ? abs(static_cast<int>(floor(log10(fabs(from))))) : 0;
  int n1 = to != 0.0 ? abs(static_cast<int>(floor(log10(fabs(to))))) : 0;
  if (n1 > n) n = n1;
  n += 4;
  // approxiamte width of a tick label in pixels
  int labelWidth = n * fm.width("0");
  // calculate number of major ticks
  int nMajorTicks = this->width() / labelWidth;
  if ( nMajorTicks > 6 ) nMajorTicks = 6;
  // try creating a scale
  const QwtScaleDiv div = axisScaleEngine(QwtPlot::xBottom)->divideScale(from,to,nMajorTicks,nMajorTicks);
  // Major ticks are placed at round numbers so the first or last tick could be missing making
  // scale look ugly. Trying to fix it if possible
  bool rescaled = false;
  // get actual tick positions
  const QwtValueList& ticks = div.ticks(QwtScaleDiv::MajorTick);
  if (!ticks.empty() && ticks.size() < nMajorTicks)
  {
    // how much first tick is shifted from the lower bound
    double firstShift = ticks.front() - div.lBound();
    // how much last tick is shifted from the upper bound
    double lastShift = div.hBound() - ticks.back();
    // range of the scale
    double range = fabs(div.hBound() - div.lBound());
    // we say that 1st tick is missing if first tick is father away from its end of the scale
    // than the last tick is from its end
    bool isFirstMissing =  fabs(firstShift) > fabs(lastShift) ;
    // if first tick is missing
    if (isFirstMissing)
    {
      // distance between nearest major ticks
      double tickSize = 0;
      if (ticks.size() == 1)
      {
        // guess the tick size in case of only one visible
        double tickLog = log10(firstShift);
        tickLog = tickLog > 0 ? ceil(tickLog) : floor(tickLog);
        tickSize = pow(10.,tickLog);
      }
      else if (ticks.size() > 1)
      {
        // take the difference between the two first ticks
        tickSize = ticks[1] - ticks[0];
      }
      // claculate how much lower bound must be moved to make the missing tick visible
      double shift = (ticks.front() - tickSize) - from;
      // if the shift is not very big rescale the axis
      if (fabs(shift/range) < 0.1)
      {
        from += shift;
        const QwtScaleDiv updatedDiv = axisScaleEngine(QwtPlot::xBottom)->divideScale(from,to,nMajorTicks,nMajorTicks);
        setAxisScaleDiv(xBottom,updatedDiv);
        rescaled = true;
      }
    }
    else // last tick is missing
    {
      // distance between nearest major ticks
      double tickSize = 0;
      if (ticks.size() == 1)
      {
        // guess the tick size in case of only one visible
        double tickLog = log10(lastShift);
        tickLog = tickLog > 0 ? ceil(tickLog) : floor(tickLog);
        tickSize = pow(10.,tickLog);
      }
      else if (ticks.size() > 1)
      {
        // take the difference between the two first ticks
        tickSize = ticks[1] - ticks[0];
      }
      // claculate how much upper bound must be moved to make the missing tick visible
      double shift = (ticks.back() + tickSize) - to;
      // if the shift is not very big rescale the axis
      if (fabs(shift/range) < 0.1)
      {
        to += shift;
        const QwtScaleDiv updatedDiv = axisScaleEngine(QwtPlot::xBottom)->divideScale(from,to,nMajorTicks,nMajorTicks);
        setAxisScaleDiv(xBottom,updatedDiv);
        rescaled = true;
      }
    }
  }

  if (!rescaled)
  {
    setAxisScaleDiv(xBottom,div);
  }
  m_zoomer->setZoomBase();
}
Exemplo n.º 14
0
QwtText ScaleDraw::label(double value) const
{
	switch (d_type){
		case Numeric:
		{
            QLocale locale = ((Graph *)d_plot->parent())->multiLayer()->locale();
			if (d_numeric_format == Superscripts){
				QString txt = locale.toString(transformValue(value), 'e', d_prec);
				QStringList list = txt.split("e", QString::SkipEmptyParts);
				if (list[0].toDouble() == 0.0)
					return QString("0");

				QString s = list[1];
				int l = s.length();
				QChar sign = s[0];
				s.remove (sign);

				while (l>1 && s.startsWith ("0", false)){
					s.remove ( 0, 1 );
					l = s.length();
				}

				if (sign == '-')
					s.prepend(sign);

				if (list[0] == "1")
					return QwtText("10<sup>" + s + "</sup>");
				else
					return QwtText(list[0] + "x10<sup>" + s + "</sup>");
			} else
				return QwtText(locale.toString(transformValue(value), d_fmt, d_prec));
		break;
		}

		case Day:
		{
			int val = static_cast<int>(transformValue(value))%7;
			if (val < 0)
				val = 7 - abs(val);
			else if (val == 0)
				val = 7;

			QString day;
			switch(d_name_format){
				case  ShortName:
					day = QDate::shortDayName (val);
				break;
				case  LongName:
					day = QDate::longDayName (val);
				break;
				case  Initial:
					day = (QDate::shortDayName (val)).left(1);
				break;
			}
			return QwtText(day);
		break;
		}

		case Month:
		{
			int val = static_cast<int>(transformValue(value))%12;
			if (val < 0)
				val = 12 - abs(val);
			else if (val == 0)
				val = 12;

			QString day;
			switch(d_name_format){
				case  ShortName:
					day = QDate::shortMonthName (val);
				break;
				case  LongName:
					day = QDate::longMonthName (val);
				break;
				case  Initial:
					day = (QDate::shortMonthName (val)).left(1);
				break;
			}
			return QwtText(day);
		break;
		}

		case Time:
			return QwtText(d_date_time_origin.time().addMSecs((int)value).toString(d_format_info));
		break;

		case Date:
            return QwtText(d_date_time_origin.addSecs((int)value).toString(d_format_info));
		break;

		case ColHeader:
		case Text:
		{
			const QwtScaleDiv scDiv = scaleDiv();
			if (!scDiv.contains (value))
				return QwtText();

			QwtValueList ticks = scDiv.ticks (QwtScaleDiv::MajorTick);

			double break_offset = 0;
			ScaleEngine *se = (ScaleEngine *)d_plot->axisScaleEngine(axis());
			/*QwtScaleEngine *qwtsc_engine=d_plot->axisScaleEngine(axis());
			ScaleEngine *se =dynamic_cast<ScaleEngine*>(qwtsc_engine);
			if(se!=NULL)
			{*/
				bool inverted = se->testAttribute(QwtScaleEngine::Inverted);
				if(se->hasBreak()){
					double lb = se->axisBreakLeft();
					double rb = se->axisBreakRight();
					if(inverted){
						if (value <= lb){
							int n_ticks = (int)ticks.count() - 1;
							double val0 = ticks[0];
							double val1 = ticks[n_ticks];
							for (int i = 1; i < n_ticks; i++){
								double aux = ticks[i];
								if(aux >= rb && val0 > aux){
									val0 = aux;
									continue;
								}
								if(aux <= lb && val1 < aux)
									val1 = aux;
							}
							break_offset = fabs(val1 - val0);
						}
					} else {
						if (value >= rb){
							double val0 = ticks[0];
							for (int i = 1; i < (int)ticks.count(); i++){
								double val = ticks[i];
								if(val0 <= lb && val >= rb){
									break_offset = fabs(val - val0);
									break;
								}
								val0 = val;
							}
						}
					}
				}

				double step = ticks[1] - ticks[0];
				int index = static_cast<int>(ticks[0] + step*ticks.indexOf(value) - 1);
				int offset = abs((int)floor(break_offset/step));
				if (offset)
					offset--;
				if (step > 0)
					index += offset;
				else
					index -= offset;
				if (index >= 0 && index < (int)d_text_labels.count())
					return QwtText(d_text_labels[index]);
				else
					return QwtText();
			//}
		break;
		}
	}
	return QwtText();
}
Exemplo n.º 15
0
void QwtPolarGrid::updateScaleDiv( const QwtScaleDiv &azimuthScaleDiv,
                                   const QwtScaleDiv &radialScaleDiv, const QwtDoubleInterval &interval )
{
  GridData &radialGrid = d_data->gridData[QwtPolar::Radius];

  const QwtPolarPlot *plt = plot();
  if ( plt && testGridAttribute( AutoScaling ) )
  {
    const QwtScaleEngine *se = plt->scaleEngine( QwtPolar::Radius );
    radialGrid.scaleDiv = se->divideScale(
                            interval.minValue(), interval.maxValue(),
                            plt->scaleMaxMajor( QwtPolar::Radius ),
                            plt->scaleMaxMinor( QwtPolar::Radius ), 0 );
  }
  else
  {
    if ( radialGrid.scaleDiv != radialScaleDiv )
      radialGrid.scaleDiv = radialScaleDiv;
  }

  GridData &azimuthGrid = d_data->gridData[QwtPolar::Azimuth];
  if ( azimuthGrid.scaleDiv != azimuthScaleDiv )
  {
    azimuthGrid.scaleDiv = azimuthScaleDiv;
  }

  bool hasOrigin = false;
  for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
  {
    AxisData &axis = d_data->axisData[axisId];
    if ( axis.isVisible && axis.scaleDraw )
    {
      if ( axisId == QwtPolar::AxisAzimuth )
      {
        axis.scaleDraw->setScaleDiv( azimuthGrid.scaleDiv );
        if ( testDisplayFlag( SmartScaleDraw ) )
        {
          axis.scaleDraw->enableComponent(
            QwtAbstractScaleDraw::Ticks, !azimuthGrid.isVisible );
        }
      }
      else
      {
        QwtScaleDiv sd = radialGrid.scaleDiv;

        QwtValueList &ticks =
          ( QwtValueList & )sd.ticks( QwtScaleDiv::MajorTick );

        if ( testDisplayFlag( SmartOriginLabel ) )
        {
          bool skipOrigin = hasOrigin;
          if ( !skipOrigin )
          {
            if ( axisId == QwtPolar::AxisLeft
                 || axisId == QwtPolar::AxisRight )
            {
              if ( d_data->axisData[QwtPolar::AxisBottom].isVisible )
                skipOrigin = true;
            }
            else
            {
              if ( d_data->axisData[QwtPolar::AxisLeft].isVisible )
                skipOrigin = true;
            }
          }
#if QWT_VERSION < 0x050200
          if ( ticks.size() > 0 && ticks.first() == sd.lBound() )
#else
          if ( ticks.size() > 0 && ticks.first() == sd.lowerBound() )
#endif
          {
            if ( skipOrigin )
            {
#if QT_VERSION < 0x040000
              ticks.pop_front();
#else
              ticks.removeFirst();
#endif
            }
            else
              hasOrigin = true;
          }
        }

        if ( testDisplayFlag( HideMaxRadiusLabel ) )
        {
#if QWT_VERSION < 0x050200
          if ( ticks.size() > 0 && ticks.last() == sd.hBound() )
#else
          if ( ticks.size() > 0 && ticks.last() == sd.upperBound() )
#endif
#if QT_VERSION < 0x040000
            ticks.pop_back();
#else
            ticks.removeLast();
#endif
        }

        axis.scaleDraw->setScaleDiv( sd );

        if ( testDisplayFlag( SmartScaleDraw ) )
        {
          axis.scaleDraw->enableComponent(
            QwtAbstractScaleDraw::Ticks, !radialGrid.isVisible );
        }

      }
    }
  }
}
Exemplo n.º 16
0
QString ScaleDraw::labelString(double value) const
{
	switch (d_type){
		case Numeric:
		{
            QLocale locale = d_plot->locale();
			if (d_plot->parent())
				locale = d_plot->multiLayer()->locale();
			if ((d_numeric_format == Superscripts)||(d_numeric_format == SuperscriptsGER)){
				QString txt = locale.toString(transformValue(value), 'e', d_prec);
				QStringList list = txt.split("e", QString::SkipEmptyParts);
				if (list.isEmpty())
					return QString::null;

				if (list[0].toDouble() == 0.0)
					return "0";

				QString s = list[1];
				int l = s.length();
				QChar sign = s[0];
				s.remove (sign);

				while (l>1 && s.startsWith ("0", false)){
					s.remove ( 0, 1 );
					l = s.length();
				}

				if (sign == '-')
					s.prepend(sign);

				if (list[0] == "1")
					return "10<sup>" + s + "</sup>";
				else {
					if (d_numeric_format == SuperscriptsGER)
						return list[0] + "·10<sup>" + s + "</sup>";
					else
						return list[0] + QString(QChar(0x00D7)) + "10<sup>" + s + "</sup>";
				}
			} else if (d_numeric_format == Engineering){
				QString eng_suff;
				double new_value = value;

				if(fabs(new_value) >= 1e18){
					eng_suff = 'E';
					new_value /= 1e18;
				} else if(fabs(new_value) >= 1e15){
					eng_suff = 'P';
					new_value /= 1e15;
				} else if(fabs(new_value) >= 1e12){
					eng_suff = 'T';
					new_value /= 1e12;
				} else if(fabs(new_value) >= 1e9){
					eng_suff = 'G';
					new_value /= 1e9;
				} else if(fabs(new_value) >= 1e6){
					eng_suff = 'M';
					new_value /= 1e6;
				} else if(fabs(new_value) >= 1e3){
					eng_suff = 'k';
					new_value /= 1e3;
				} else if(fabs(new_value) >= 1){
					eng_suff = "";
					new_value /= 1.0;
				} else if(fabs(new_value) >= 1e-3){
					eng_suff = 'm';
					new_value /= 1e-3;
				} else if(fabs(new_value) >= 1e-6){
					eng_suff = 'µ';
					new_value /= 1e-6;
				} else if(fabs(new_value) >= 1e-9){
					eng_suff = 'n';
					new_value /= 1e-9;
				} else if(fabs(new_value) >= 1e-12){
					eng_suff = 'p';
					new_value /= 1e-12;
				} else if(fabs(new_value) >= 1e-15){
					eng_suff = 'f';
					new_value /= 1e-15;
				} else {
					eng_suff = 'a';
					new_value /= 1e-18;
				}

				QString txt = locale.toString((new_value), 'f', d_prec);

				if(txt.contains(QRegExp("^0[\\.,]?0*$")))
					return "0";

				return txt + eng_suff;
			} else
				return locale.toString(transformValue(value), d_fmt, d_prec);
		break;
		}

		case Day:
		{
			int val = int(transformValue(value))%7;
			if (val < 0)
				val = 7 - abs(val);
			else if (val == 0)
				val = 7;

			QString day;
			switch(d_name_format){
				case  ShortName:
					day = QDate::shortDayName (val);
				break;
				case  LongName:
					day = QDate::longDayName (val);
				break;
				case  Initial:
					day = (QDate::shortDayName (val)).left(1);
				break;
			}
			return day;
		break;
		}

		case Month:
		{
			int val = int(transformValue(value))%12;
			if (val < 0)
				val = 12 - abs(val);
			else if (val == 0)
				val = 12;

			QString day;
			switch(d_name_format){
				case  ShortName:
					day = QDate::shortMonthName (val);
				break;
				case  LongName:
					day = QDate::longMonthName (val);
				break;
				case  Initial:
					day = (QDate::shortMonthName (val)).left(1);
				break;
			}
			return day;
		break;
		}

		case Time:
		{
			QTime time = Table::dateTime(value).time();
			if (d_format_info == "M")
				return QString::number(60*time.hour() + time.minute());
			else if (d_format_info == "S")
				return QString::number(3600*time.hour() + 60*time.minute() + time.second());

			return time.toString(d_format_info);
		break;
		}

		case Date:
			return Table::dateTime(value).toString(d_format_info);
		break;

		case ColHeader:
		case Text:
		{
			const QwtScaleDiv scDiv = scaleDiv();
			if (!scDiv.contains (value) || floor(value) < value)
				return QString::null;

			QwtValueList ticks = scDiv.ticks (QwtScaleDiv::MajorTick);

			double break_offset = 0;
			ScaleEngine *se = (ScaleEngine *)d_plot->axisScaleEngine(axis());
			bool inverted = se->testAttribute(QwtScaleEngine::Inverted);
			if(se->hasBreak()){
			    double lb = se->axisBreakLeft();
			    double rb = se->axisBreakRight();
                if(inverted){
                    if (value <= lb){
						int n_ticks = (int)ticks.count() - 1;
                        double val0 = ticks[0];
						double val1 = ticks[n_ticks];
                        for (int i = 1; i < n_ticks; i++){
                            double aux = ticks[i];
                            if(aux >= rb && val0 > aux){
                                val0 = aux;
								continue;
                            }
							if(aux <= lb && val1 < aux)
                                val1 = aux;
                        }
						break_offset = fabs(val1 - val0);
                    }
				} else {
                    if (value >= rb){
                        double val0 = ticks[0];
                        for (int i = 1; i < (int)ticks.count(); i++){
                            double val = ticks[i];
                            if(val0 <= lb && val >= rb){
                                break_offset = fabs(val - val0);
                                break;
                            }
                            val0 = val;
                        }
                    }
			    }
			}

			if (ticks.size() < 2)
				return QString::null;

        	double step = ticks[1] - ticks[0];
        	int index = int(ticks[0] + step*ticks.indexOf(value) - 1);
            int offset = abs((int)floor(break_offset/step));
            if (offset)
                offset--;
            if (step > 0)
                index += offset;
            else
                index -= offset;
			if (index >= 0 && index < (int)d_text_labels.count())
				return d_text_labels[index];
			else
				return QString::null;
		break;
		}
	}
	return QString::null;
}
Exemplo n.º 17
-1
void ScaleDraw::drawTick(QPainter *p, double value, int len) const
{
	ScaleEngine *sc_engine = (ScaleEngine *)d_plot->axisScaleEngine(axis());
	/*QwtScaleEngine *qwtsc_engine=d_plot->axisScaleEngine(axis());
    ScaleEngine *sc_engine =dynamic_cast< ScaleEngine*>(qwtsc_engine);
	if(sc_engine!=NULL)
	{*/
		if (sc_engine->hasBreak()){
			int align = alignment();
			bool invertedScale = sc_engine->testAttribute(QwtScaleEngine::Inverted);
			if (align == BottomScale || align == LeftScale){
				if (invertedScale && sc_engine->axisBreakRight() == value)
					return;
				if (!invertedScale && sc_engine->axisBreakLeft() == value)
					return;
			} else {
				if (!invertedScale && sc_engine->axisBreakRight() == value)
					return;
				if (invertedScale && sc_engine->axisBreakLeft() == value)
					return;
			}
		}
	//}
		 QwtScaleDiv scDiv = scaleDiv();
		 QwtValueList majTicks = scDiv.ticks(QwtScaleDiv::MajorTick);
		 if (majTicks.contains(value) && (d_majTicks == In || d_majTicks == None))
			 return;

		 QwtValueList medTicks = scDiv.ticks(QwtScaleDiv::MediumTick);
		 if (medTicks.contains(value) && (d_minTicks == In || d_minTicks == None))
			 return;

		 QwtValueList minTicks = scDiv.ticks(QwtScaleDiv::MinorTick);
		 if (minTicks.contains(value) && (d_minTicks == In || d_minTicks == None))
			 return;

		 QwtScaleDraw::drawTick(p, value, len);
}