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

A layer optimized for huge number of curves having all the same X sampling. More...

#include <XUniqueYColorLines.h>

Inheritance diagram for SciFigs::XUniqueYColorLines:
SciFigs::GraphContentLayer QGpGuiTools::PropertyItem QGpCoreTools::XMLClass

List of all members.

Public Slots

void setColor (int curveIndex, int red, int green, int blue)

Signals

void dataSelected (int id, const QVector< int > *indexList)

Public Member Functions

virtual void addProperties (PropertyProxy *pp)
Rect boundingRect () const
void clear ()
const QColor * colors () const
int curveCount ()
void divYbyX (double constant)
virtual bool hasProperties ()
double lineWeight () const
double lineWeightMM () const
void mulYbyX (double constant)
virtual void properties (PropertyWidget *w) const
virtual void removeProperties (PropertyProxy *pp)
void setColor (int index, const QColor &col)
void setColors (QColor *col)
void setLineWeight (double lw)
void setPointCount (int nCurve, int nX)
virtual void setProperty (uint wid, int pid, QVariant val)
virtual bool trackRectangle (int, double rx1, double ry1, double rx2, double ry2, Qt::KeyboardModifiers)
const double * x () const
double * x ()
virtual const QString & xml_tagName () const
 XUniqueYColorLines (AxisWindow *parent=0)
const double * y () const
double * y ()
 ~XUniqueYColorLines ()

Static Public Attributes

static const QString xmlXUniqueYColorLinesTag = "XUniqueYColorLines"

Protected Member Functions

virtual void paintData (const LayerPainterRequest &lp, QPainter &p, double dotpercm) const
virtual bool xml_setBinaryData (XML_SETBINARYDATA_ARGS)
virtual void xml_writeBinaryData (XML_WRITEBINARYDATA_ARGS) const
virtual void xml_writeProperties (XML_WRITEPROPERTIES_ARGS) const

Protected Attributes

QColor * _colors
int _curveCount
double _lineWeight
XYColorLinesProperties_propertiesTab
double * _x
int _xCount
double * _y

Properties

double lineWeight

Detailed Description

A layer optimized for huge number of curves having all the same X sampling.


Constructor & Destructor Documentation

Description of constructor still missing

References _colors, _curveCount, _lineWeight, _propertiesTab, _x, _xCount, _y, and TRACE.

Description of destructor still missing

References clear(), and TRACE.

{
  TRACE;
  clear();
}

Member Function Documentation

Setup property editor

Reimplemented from SciFigs::GraphContentLayer.

References SciFigs::XYColorLines::_tab, QGpGuiTools::PropertyProxy::addReference(), QGpGuiTools::PropertyProxy::addTab(), QGpGuiTools::PropertyProxy::setCurrentTab(), QGpCoreTools::tr(), TRACE, and w.

{
  TRACE;
  if(pp->setCurrentTab(XYColorLines::_tab)) {
    pp->addReference(this);
  } else {
    XYColorLinesProperties * w=new XYColorLinesProperties;
    pp->addTab(XYColorLines::_tab, tr("Color Lines"), w, this);
  }
}

Implements SciFigs::GraphContentLayer.

References _curveCount, _x, _xCount, _y, QGpCoreTools::Rect::add(), TRACE, and y().

{
  TRACE;
  if(_curveCount==0 || !_xCount) return Rect();
  Rect r(_x[0], _y[0], _x[0], _y[0] );
  double * y=_y;
  for(int i=0;i < _curveCount;i++ ) {
    for(int j=0;j < _xCount;j++ ) r.add(_x[j], y[j] );
    y+=_xCount;
  }
  return r;
}
const QColor* SciFigs::XUniqueYColorLines::colors ( ) const [inline]
{return _curveCount;}
void SciFigs::XUniqueYColorLines::dataSelected ( int  id,
const QVector< int > *  indexList 
) [signal]

Referenced by trackRectangle().

void SciFigs::XUniqueYColorLines::divYbyX ( double  constant)

References _curveCount, _x, _xCount, _y, TRACE, and y().

Referenced by MonoStation::StationResults::integrate().

{
  TRACE;
  LayerLocker ll(this);
  double * y=_y;
  for(int i=0;i < _curveCount;i++ ) {
    for(int j=0;j < _xCount;j++ ) {
      y[j] /= constant * _x[j];
    }
    y+=_xCount;
  }
}
virtual bool SciFigs::XUniqueYColorLines::hasProperties ( ) [inline, virtual]

Reimplemented from SciFigs::GraphContentLayer.

{return true;}
double SciFigs::XUniqueYColorLines::lineWeight ( ) const [inline]

Referenced by paintData().

{return _lineWeight;}
double SciFigs::XUniqueYColorLines::lineWeightMM ( ) const [inline]

Referenced by properties().

{return _lineWeight*10.0;}
void SciFigs::XUniqueYColorLines::mulYbyX ( double  constant)

References _curveCount, _x, _xCount, _y, TRACE, and y().

Referenced by MonoStation::StationResults::derivate().

{
  TRACE;
  LayerLocker ll(this);
  double * y=_y;
  for(int i=0;i < _curveCount;i++ ) {
    for(int j=0;j < _xCount;j++ ) {
      y[j] *= constant * _x[j];
    }
    y+=_xCount;
  }
}
void SciFigs::XUniqueYColorLines::paintData ( const LayerPainterRequest lp,
QPainter &  p,
double  dotpercm 
) const [protected, virtual]

Implements SciFigs::GraphContentLayer.

References _colors, _curveCount, _lineWeight, _x, _xCount, _y, SciFigs::GraphContentOptions::checkOrigin(), lineWeight(), SciFigs::LayerPainterRequest::options(), QGpCoreTools::Point2D::setX(), QGpCoreTools::Point2D::setY(), SciFigs::LayerPainterRequest::size(), SciFigs::LayerPainterRequest::terminated(), TRACE, SciFigs::GraphContentOptions::xr2s(), y(), and SciFigs::GraphContentOptions::yr2s().

{
  TRACE;
  if( !_curveCount || !_xCount) return ;

  const GraphContentOptions& gc=lp.options();
  int h=lp.size().height();
  Point2D * realPoints=new Point2D[_xCount];
  int * screenX=new int[_xCount];
  for(int i=0;i < _xCount;i++ ) {
    realPoints[i].setX(_x[i]);
    screenX[i]=gc.xr2s(_x[i]);
  }
  double * y=_y;
  QPoint pscreen1, pscreen2;
  int lineWeight=(int) floor(_lineWeight * dotpercm + 0.5);
  if(lineWeight<1) lineWeight=1;
  QPen currentPen(Qt::black, lineWeight, Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin);
  for(int i=0;i < _curveCount;i++ ) {
    if(lp.terminated()) {
      delete [] realPoints;
      delete [] screenX;
      return;
    }
    QPolygon ap(_xCount);
    if(_colors) currentPen.setColor(_colors[ i ] );
    p.setPen(currentPen);
    for(int j=0;j < _xCount;j++ ) {
      realPoints[j].setY(y[j]);
    }
    y+=_xCount;
    Point2D * p1=realPoints, *p2;
    pscreen2.setX(screenX[0]);
    int subCurveCount=0;
    for(int j=1;j < _xCount;j++ ) {
      p2=p1 + 1;
      pscreen1.setX(screenX[j-1] );
      pscreen2.setX(screenX[j] );
      if(gc.yr2s( *p1, *p2, pscreen1, pscreen2) ) {
        gc.checkOrigin(pscreen1, pscreen2, h);
        if(subCurveCount==0) {
          ap.setPoint(0, pscreen1);
          subCurveCount=1;
        } else {
          if(ap.point(subCurveCount - 1)!=pscreen1) {
            p.drawPolyline (ap.data(), subCurveCount);
            ap.setPoint(0, pscreen1);
            subCurveCount=1;
          }
        }
        ap.setPoint(subCurveCount, pscreen2);
        subCurveCount++;
      } else if(subCurveCount > 1) {
        p.drawPolyline (ap.data(), subCurveCount);
        subCurveCount=0;
      }
      p1=p2;
    }
    if(subCurveCount > 1) p.drawPolyline (ap.data(), subCurveCount);
  }
  delete [] realPoints;
  delete [] screenX;
}
void SciFigs::XUniqueYColorLines::setColor ( int  index,
const QColor &  col 
)

References _colors, and TRACE.

Referenced by MonoStation::StationResults::setWindowColor().

{
  TRACE;
  LayerLocker ll(this);
  _colors[index]=col;
}
void SciFigs::XUniqueYColorLines::setColor ( int  curveIndex,
int  red,
int  green,
int  blue 
) [slot]

References _colors, _curveCount, and TRACE.

{
  TRACE;
  LayerLocker ll(this);
  if(curveIndex < 0 || curveIndex >= _curveCount || !_colors) return ;
  _colors[ curveIndex ]=QColor(red, green, blue);
}

References _colors, and TRACE.

Referenced by MonoStation::StationResults::addWindows(), and MonoStation::StationResults::setWindows().

{
  TRACE;
  LayerLocker ll(this);
  delete _colors;
  _colors=col;
}
void SciFigs::XUniqueYColorLines::setLineWeight ( double  lw) [inline]
void SciFigs::XUniqueYColorLines::setPointCount ( int  nCurves,
int  nX 
)

This is the unique function you have to call to populate this layer with lines.

References _curveCount, _x, _xCount, _y, clear(), and TRACE.

Referenced by MonoStation::StationResults::addWindows(), MonoStation::StationResults::setWindows(), and PtMotionResults::updateSignals().

{
  TRACE;
  LayerLocker ll(this);
  if(_curveCount>0 && nX==_xCount) {
    if(nCurves==0) {
      clear();
      return;
    }
    int minNCurves=nCurves;
    if(_curveCount<minNCurves) minNCurves=_curveCount;
    double * new_y=new double [ nCurves*nX ];
    memcpy(new_y, _y, minNCurves * nX * sizeof(double));
    delete [] _y;
    _y=new_y;
    _curveCount=nCurves;
  } else {
    clear();
    _curveCount=nCurves;
    _xCount=nX;
    if(_xCount > 0) _x=new double[ _xCount ];
    if(_curveCount > 0) _y=new double [ _xCount * _curveCount ];
  }
}
void SciFigs::XUniqueYColorLines::setProperty ( uint  wid,
int  pid,
QVariant  val 
) [virtual]
bool SciFigs::XUniqueYColorLines::trackRectangle ( int  id,
double  rx1,
double  ry1,
double  rx2,
double  ry2,
Qt::KeyboardModifiers   
) [virtual]

When the user select curve using the mouse pointer

Reimplemented from SciFigs::GraphContentLayer.

References _curveCount, _x, _xCount, _y, dataSelected(), QGpCoreTools::Rect::includes(), TRACE, and y().

{
  TRACE;
  // Select the points inside the rectangle and call dataSelected(QVector * indexList)
  // This trackRectangle function can be redefined in sub-classes
  Rect r(rx1, ry1, rx2, ry2);
  QVector<int> * indexList=new QVector<int>;
  double * y=_y;
  for(int i=0;i < _curveCount;i++ ) {
    for(int j=1;j < _xCount;j++ ) {
      if(r.includes(_x[j-1], y[j-1], _x[j], y[j] )) {
        indexList->push_back(i);
        break;
      }
    }
    y+=_xCount;
  }
  if(!indexList->isEmpty()) emit dataSelected(id, indexList);
  delete indexList;
  return true;
}
const double* SciFigs::XUniqueYColorLines::x ( ) const [inline]
double* SciFigs::XUniqueYColorLines::x ( ) [inline]
{return _x;}

This function must be re-implemented in all classes dealing with binary data that cannot be saved in an ASCII xml file (e.g. due to the amount of data).

See also xml_writeBinaryData().

The difference between xml_setBinaryData() and xml_setBinaryData200410() is detected by the type of tag at the beginning of each block if it can be read with QString ==> 200510, else try with a normal C string, if it match the current tag then execute xml_setBinaryData200411().

See also xml_setBinaryData200411() to maintain compatibility with previous versions of xml storages.

For the arguments of this function use Macro XML_SETBINARYDATA_ARGS.

Reimplemented from QGpCoreTools::XMLClass.

References _colors, _curveCount, _x, _xCount, _y, SciFigs::XYColorLines::restoreBinaryColorVector(), and TRACE.

{
  TRACE;
  Q_UNUSED(context);
  s >> _curveCount;
  s >> _xCount;
  if(_curveCount > 0) {
    XYColorLines::restoreBinaryColorVector(s, _colors, _curveCount, context);
    _x=new double [ _xCount ];
    s.readRawData(( char * ) _x, sizeof(double) * _xCount);
    _y=new double [ _xCount * _curveCount ];
    s.readRawData(( char * ) _y, sizeof(double) * _xCount * _curveCount);
  }
  return true;
}
virtual const QString& SciFigs::XUniqueYColorLines::xml_tagName ( ) const [inline, virtual]

This function must be re-implemented in all classes dealing with binary data that cannot be saved in an ASCII xml file (e.g. due to the amount of data).

The way binary data is stored drastically changed in November 2006 with the introduction of tar.gz structures for xml files. Each class willing to store binary data can automatically generate a new file (with an automatic file name) in the .tar.gz structure by sending bytes to s.

See also xml_setBinaryData().

For the arguments of this function use Macro XML_WRITEBINARYDATA_ARGS.

Reimplemented from QGpCoreTools::XMLClass.

References _colors, _curveCount, _x, _xCount, _y, SciFigs::XYColorLines::saveBinaryColorVector(), and TRACE.

{
  TRACE;
  Q_UNUSED(context);
  s << _curveCount;
  s << _xCount;
  XYColorLines::saveBinaryColorVector(s, _colors, _curveCount);
  s.writeRawData(( const char * ) _x, sizeof(double) * _xCount);
  s.writeRawData(( const char * ) _y, sizeof(double) * _xCount * _curveCount);
}

Reimplemented from SciFigs::GraphContentLayer.

References SciFigs::XMLSciFigs::data(), TRACE, and QGpCoreTools::XMLClass::writeBinaryData().

{
  TRACE;
  GraphContentLayer::xml_writeProperties(s, context);
  XMLSciFigs * scifigsContext=static_cast<XMLSciFigs *>(context);
  if(scifigsContext->data()) writeBinaryData(s, context);
}
const double* SciFigs::XUniqueYColorLines::y ( ) const [inline]
double* SciFigs::XUniqueYColorLines::y ( ) [inline]
{return _y;}

Member Data Documentation

Referenced by paintData(), and XUniqueYColorLines().

Referenced by XUniqueYColorLines().

double* SciFigs::XUniqueYColorLines::_x [protected]
double* SciFigs::XUniqueYColorLines::_y [protected]
const QString SciFigs::XUniqueYColorLines::xmlXUniqueYColorLinesTag = "XUniqueYColorLines" [static]

Property Documentation


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