All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Types | Public Member Functions | Static Public Attributes | Protected Member Functions | Properties
SciFigs::SlopeEstimator Class Reference

Brief description of class still missing. More...

#include <SlopeEstimator.h>

Inheritance diagram for SciFigs::SlopeEstimator:
SciFigs::LineLayer SciFigs::GraphContentLayer QGpGuiTools::PropertyItem QGpCoreTools::XMLClass

List of all members.

Public Types

enum  Format { DegreesFromX, DegreesFromY, RatioYOverX, RatioXOverY }

Public Member Functions

QString fontString () const
Format format () const
QString formatString () const
void setFontString (QString fs)
void setFormat (Format f)
void setFormat (QString f)
 SlopeEstimator (AxisWindow *parent=0)
virtual const QString & xml_tagName () const

Static Public Attributes

static const QString xmlSlopeEstimatorTag = "SlopeEstimator"

Protected Member Functions

virtual void paintData (const LayerPainterRequest &lp, QPainter &p, double dotpercm) const
virtual void paintText (const LayerPainterRequest &lp, double dotpercm)

Properties

QString font
QString format

Detailed Description

Brief description of class still missing.

Full description of class still missing


Member Enumeration Documentation

Enumerator:
DegreesFromX 
DegreesFromY 
RatioYOverX 
RatioXOverY 

Constructor & Destructor Documentation

References SciFigs::Symbol::Circle, DegreesFromX, SciFigs::AbstractLine::setPen(), SciFigs::LineLayer::setReferenceLine(), SciFigs::AbstractLine::setSymbol(), and TRACE.

  : LineLayer(parent)
{
  TRACE;
  PlotLine2D * ref=new PlotLine2D;
  ref->setPen(Pen( Qt::red, 0.6) );
  ref->setSymbol(Symbol( Symbol::Circle, 1.2, Pen(Qt::red, 0.0),
                             Brush(Qt::red, Qt::SolidPattern) ));
  setReferenceLine(ref);

  _format=DegreesFromX;
}

Member Function Documentation

QString SciFigs::SlopeEstimator::fontString ( ) const [inline]
{return _textFont.toString();}
{return _format;}

References DegreesFromX, DegreesFromY, RatioXOverY, RatioYOverX, and TRACE.

{
  TRACE;
  switch(_format) {
  case DegreesFromX: return "DegreesFromX";
  case DegreesFromY: return "DegreesFromY";
  case RatioYOverX: return "RatioYOverX";
  case RatioXOverY: return "RatioXOverY";
  }
  return QString::null;
}
void SciFigs::SlopeEstimator::paintData ( const LayerPainterRequest lp,
QPainter &  p,
double  dotpercm 
) const [protected, virtual]

Reimplemented from SciFigs::LineLayer.

References SciFigs::LineLayer::begin(), SciFigs::GraphContentOptions::checkOrigin(), SciFigs::Pen::color(), SciFigs::PlotLine2D::count(), SciFigs::LineLayer::end(), QGpCoreTools::Angle::initRadians(), SciFigs::AbstractLine::isValid(), SciFigs::AbstractLine::isVisible(), SciFigs::LineLayer::line(), SciFigs::LayerPainterRequest::options(), SciFigs::Symbol::pen(), SciFigs::PlotLine2D::point(), SciFigs::LineLayer::pointOptions(), SciFigs::GraphContentOptions::r2s(), QGpCoreTools::Point2D::rotate(), SciFigs::LayerPainterRequest::size(), SciFigs::AbstractLine::symbol(), SciFigs::LayerPainterRequest::terminated(), and TRACE.

{
  TRACE;
  // Draw classical lines
  LineLayer::paintData(lp, p, dotpercm);
  const GraphContentOptions& gc=lp.options();
  int h=lp.size().height();
  p.setRenderHints(QPainter::Antialiasing, true);
  p.setPen(Qt::NoPen);
  QRectF r;
  QList<AbstractLine *>::const_iterator it;
  QMutexLocker ml(&_textPathsMutex);
  QList<QPainterPath>::const_iterator itText=_textPaths.begin();
  p.setPen(Qt::NoPen);
  for(it=begin() ;it!=end();++it) {
    if(lp.terminated()) return;
    PlotLine2D * line=static_cast<PlotLine2D *>( *it);
    int countPoints=line->count();
    p.setBrush(line->symbol().pen().color());
    if(countPoints && line->isVisible()) {
      int i=0;
      Point p1;
      while(i<countPoints) {
        if(line->isValid(i)) {
          p1=line->point(i, pointOptions());
          break;
        }
        i++;
      }
      if(i>=countPoints) continue ;
      QPoint pscreen1, pscreen2;
      for(i++;i < countPoints;i++ ) {
        if(!line->isValid(i)) continue;
        Point p2=line->point(i, pointOptions());
        // Calculate display angle
        if(gc.r2s(p1, p2, pscreen1, pscreen2) ) {
          gc.checkOrigin(pscreen1, pscreen2, h);
          Angle angle(pscreen2.x()-pscreen1.x(), pscreen2.y()-pscreen1.y());
          angle.initRadians();
          angle.initDegrees(); // Required by QPainter
          QPoint pMidScreen=(pscreen2+pscreen1)*0.5;
          r=itText->boundingRect();
          int originalTop=(int) r.top();
          r.moveCenter(pMidScreen);
          p.save();
          p.rotate(angle.degrees());
          QPointF c(( r.left() + r.right()) * 0.5, r.bottom());
          Point2D pt(c.x(), c.y());
          pt.rotate(angle);
          p.translate(pt.x() - c.x() + r.left(), pt.y() - c.y() + r.top());
          p.setOpacity(0.7);
          p.fillRect( -4, originalTop-4, (int)r.width()+8, (int)r.height()+8, Qt::white);
          p.setOpacity(1);
          p.drawPath(*itText);
          itText++;
          p.restore();
        }
        p1=p2;
      }
    }
  }
  p.setRenderHints(QPainter::Antialiasing, false);
}
void SciFigs::SlopeEstimator::paintText ( const LayerPainterRequest lp,
double  dotpercm 
) [protected, virtual]

Reimplemented from SciFigs::GraphContentLayer.

References QGpCoreTools::Point2D::azimuthTo(), SciFigs::LineLayer::begin(), SciFigs::GraphContentOptions::checkOrigin(), SciFigs::PlotLine2D::count(), DegreesFromX, DegreesFromY, SciFigs::LineLayer::end(), QGpCoreTools::Angle::initRadians(), SciFigs::AbstractLine::isValid(), SciFigs::AbstractLine::isVisible(), SciFigs::LineLayer::line(), SciFigs::LayerPainterRequest::options(), SciFigs::PlotLine2D::point(), SciFigs::LineLayer::pointOptions(), SciFigs::GraphContentOptions::printBitmap(), SciFigs::GraphContentOptions::r2s(), RatioXOverY, RatioYOverX, SAFE_UNINITIALIZED, SciFigs::GraphicObject::scaleFont(), SciFigs::SciFigsGlobal::screenResolution(), SciFigs::LayerPainterRequest::size(), TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().

{
  TRACE;
  QMutexLocker ml(&_textPathsMutex);
  _textPaths.clear();
  const GraphContentOptions& gc=lp.options();
  int h=lp.size().height();
  double coef=dotpercm/SciFigsGlobal::screenResolution();
  QFont scaledFont=_textFont;
  if(coef!=1.0 && gc.printBitmap())
    GraphicObject::scaleFont(scaledFont, coef);
  QRect r;
  QList<AbstractLine *>::const_iterator it;
  for(it=begin() ;it!=end();++it) {
    PlotLine2D * line=static_cast<PlotLine2D *>( *it);
    int countPoints=line->count();
    if(countPoints && line->isVisible()) {
      int i=0;
      Point p1;
      while(i<countPoints) {
        if(line->isValid(i)) {
          p1=line->point(i, pointOptions());
          break;
        }
        i++;
      }
      if(i>=countPoints) continue ;
      QPoint pscreen1, pscreen2;
      for(i++;i < countPoints;i++ ) {
        if(!line->isValid(i)) continue;
        Point p2=line->point(i, pointOptions());
        // Calculate display angle
        if(gc.r2s(p1, p2, pscreen1, pscreen2) ) {
          gc.checkOrigin(pscreen1, pscreen2, h);
          Angle angle(pscreen2.x()-pscreen1.x(), pscreen2.y()-pscreen1.y());
          angle.initRadians();
          angle.initDegrees();
          QPoint pMidScreen=(pscreen2+pscreen1)*0.5;
          // Calculate number to plot
          double value;
          SAFE_UNINITIALIZED(value,0);
          switch (_format) {
          case DegreesFromX: value=p1.azimuthTo(p2); break;
          case DegreesFromY: value=0.5*M_PI-p1.azimuthTo(p2); break;
          case RatioYOverX: value=(p2.y()-p1.y())/(p2.x()-p1.x()); break;
          case RatioXOverY: value=(p2.x()-p1.x())/(p2.y()-p1.y()); break;
          }
          QPainterPath p;
          p.addText(0, 0, scaledFont, QString::number(fabs(value), 'f', 1) );
          _textPaths.append(p);
        }
        p1=p2;
      }
    }
  }
}
void SciFigs::SlopeEstimator::setFontString ( QString  fs) [inline]
{_textFont.fromString(fs);}

Referenced by GraphicWindow::GraphicWindow().

{_format=f;}

References DegreesFromX, DegreesFromY, RatioXOverY, RatioYOverX, and TRACE.

{
  TRACE;
  if(f.isEmpty()) return;
  QChar axis=f[f.count()-1];
  if(f[0]=='D') {
    if(axis=='X') _format=DegreesFromX; else _format=DegreesFromY;
  } else {
    if(axis=='X') _format=RatioYOverX; else _format=RatioXOverY;
  }
}
virtual const QString& SciFigs::SlopeEstimator::xml_tagName ( ) const [inline, virtual]

Reimplemented from SciFigs::LineLayer.


Member Data Documentation

const QString SciFigs::SlopeEstimator::xmlSlopeEstimatorTag = "SlopeEstimator" [static]

Property Documentation

QString SciFigs::SlopeEstimator::font [read, write]
QString SciFigs::SlopeEstimator::format [read, write]

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines