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

Storage for a rectangle with coordinates in double precision A rectangle is defined by top-left corner (x1,y1) and bottom-right corner (x2,y2). All function that changes the coordinates of these two points check for validity. More...

#include <Rect.h>

Inheritance diagram for QGpCoreTools::Rect:
QGpCoreTools::XMLClass

List of all members.

Public Types

enum  Area {
  AllRect, AboveAscDiag, BelowAscDiag, AboveDescDiag,
  BelowDescDiag
}

Public Member Functions

void add (double x, double y)
void add (const Point &p)
void add (const Point2D &p)
void add (const Rect &r)
double area () const
Point2D bottomRight () const
void enlarge (double dx, double dy, SamplingOptions xScale, SamplingOptions yScale)
void enlarge (double ratio, SamplingOptions xScale, SamplingOptions yScale)
double height () const
bool includes (const Rect &r) const
bool includes (const Point &p) const
bool includes (const Point2D &p) const
bool includes (const Point2D &p, Area inArea) const
bool includes (const Point2D &p1, const Point2D &p2) const
bool includes (double x1, double y1, double x2, double y2) const
Rect intersect (const Rect &r) const
void intersect (Point &p1, Point &p2) const
bool isNull ()
void printDebug () const
 Rect ()
 Rect (const Point2D &p1, const Point2D &p2)
 Rect (const Point &p1, const Point &p2)
 Rect (const QPoint &p1, const QPoint &p2)
 Rect (const QPointF &p1, const QPointF &p2)
 Rect (double nx1, double ny1, double nx2, double ny2)
 Rect (const Rect &o)
void setLimits (double nx1, double ny1, double nx2, double ny2)
void setX1 (double nx1)
void setX2 (double nx2)
void setY1 (double ny1)
void setY2 (double ny2)
void square ()
Point2D topLeft () const
double width () const
double x1 () const
double x2 () const
virtual const QString & xml_tagName () const
double y1 () const
double y2 () const
virtual ~Rect ()

Static Public Attributes

static const QString xmlRectTag = "Rect"

Protected Member Functions

virtual XMLMember xml_member (XML_MEMBER_ARGS)
virtual bool xml_setProperty (XML_SETPROPERTY_ARGS)
virtual void xml_writeProperties (XML_WRITEPROPERTIES_ARGS) const

Protected Attributes

double _x1
double _x2
double _y1
double _y2

Detailed Description

Storage for a rectangle with coordinates in double precision A rectangle is defined by top-left corner (x1,y1) and bottom-right corner (x2,y2). All function that changes the coordinates of these two points check for validity.


Member Enumeration Documentation

Enumerator:
AllRect 
AboveAscDiag 
BelowAscDiag 
AboveDescDiag 
BelowDescDiag 

Constructor & Destructor Documentation

References setLimits().

{
  setLimits(0,0,0,0);
}
QGpCoreTools::Rect::Rect ( const Point2D p1,
const Point2D p2 
) [inline]

References setLimits(), QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().

{
  setLimits(p1.x(), p1.y(), p2.x(), p2.y());
}
QGpCoreTools::Rect::Rect ( const Point p1,
const Point p2 
) [inline]

References setLimits(), QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().

{
  setLimits(p1.x(), p1.y(), p2.x(), p2.y());
}
QGpCoreTools::Rect::Rect ( const QPoint &  p1,
const QPoint &  p2 
) [inline]

References setLimits().

{
  setLimits(p1.x(), p1.y(), p2.x(), p2.y());
}
QGpCoreTools::Rect::Rect ( const QPointF &  p1,
const QPointF &  p2 
) [inline]

References setLimits().

{
  setLimits(p1.x(), p1.y(), p2.x(), p2.y());
}
QGpCoreTools::Rect::Rect ( double  nx1,
double  ny1,
double  nx2,
double  ny2 
) [inline]

References setLimits().

{
  setLimits(nx1,ny1,nx2,ny2);
}

References _x1, _x2, _y1, and _y2.

{
  _x1=o._x1;
  _y1=o._y1;
  _x2=o._x2;
  _y2=o._y2;
}
virtual QGpCoreTools::Rect::~Rect ( ) [inline, virtual]
{}

Member Function Documentation

void QGpCoreTools::Rect::add ( double  x,
double  y 
)

Change rectangle size to include the new point, if already included, does nothing.

It also does nothing if the point is outside rectangle (-1e99, -1e99, 1e99, 1e99).

References _x1, _x2, _y1, _y2, and TRACE.

Referenced by add(), NAModelsPlot::boundingRect(), SciFigs::CircleViewer::boundingRect(), SciFigs::XUniqueYColorLines::boundingRect(), SciFigs::XYPlot::boundingRect(), SciFigs::GraphContent::boundingRect(), ArrayCore::ArrayStations::rectangle(), DinverDCGui::DCModelViewer::setLimits(), and DrawView::setMousePoint().

{
  TRACE;
  if((x>-1e99 && x<_x1) || _x1<=-1e99) _x1=x;
  if((x<1e99 && x>_x2) || _x2>=1e99) _x2=x;
  if((y>-1e99 && y<_y1) || _y1<=-1e99) _y1=y;
  if((y<1e99 && y>_y2) || _y2>=1e99) _y2=y;
}
void QGpCoreTools::Rect::add ( const Point p)

Change rectangle size to include the new point, if already included, does nothing.

It also does nothing if the point is outside rectangle (-1e99, -1e99, 1e99, 1e99).

References add(), TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().

{
  TRACE;
  add(p.x(), p.y());
}
void QGpCoreTools::Rect::add ( const Point2D p)

Change rectangle size to include the new point, if already included, does nothing.

It also does nothing if the point is outside rectangle (-1e99, -1e99, 1e99, 1e99).

References add(), TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().

{
  TRACE;
  add(p.x(), p.y());
}
void QGpCoreTools::Rect::add ( const Rect r)

Change rectangle size to include the new rectangle, if already included, does nothing.

It also does nothing if the rectangle is outside rectangle (-1e99, -1e99, 1e99, 1e99).

References _x1, _x2, _y1, _y2, add(), and TRACE.

{
  TRACE;
  add(r._x1, r._y1);
  add(r._x2, r._y2);
}
double QGpCoreTools::Rect::area ( ) const [inline]

Referenced by QGpCoreTools::Histogram::normalize().

{return width()*height();}
{return Point2D(_x2, _y2);}
void QGpCoreTools::Rect::enlarge ( double  dx,
double  dy,
SamplingOptions  xScale,
SamplingOptions  yScale 
)

Enlarges rectange by dx and dy in both direction. Add or multiply according to the scale type. Inversed scales are considered like linear scales

References _x1, _x2, _y1, _y2, QGpCoreTools::InversedScale, QGpCoreTools::LogScale, and TRACE.

Referenced by addPlot(), DimensionItem::boundingRect(), HistogramWidget::setHistogram(), Simulator::setKmax(), PtMotionResults::setLimits(), MapWindow::setLimits(), MonoStation::AbstractSummary::setLimits(), and GeopsyGui::ArrayMap::setLimitsArray().

{
  TRACE;
  switch(xScale) {
  case LogScale:
    _x1 *= 1.0-dx;
    _x2 *= 1.0+dx;
    break;
  case InversedScale:
    _x1=1.0/(1.0/_x1 + 1.0/dx);
    _x2=1.0/(1.0/_x2 - 1.0/dx);
    break;
  default:
    _x1-=dx;
    _x2+=dx;
    break;
  }
  switch(yScale) {
  case LogScale:
    _y1*=1.0-dy;
    _y2*=1.0+dy;
    break;
  case InversedScale:
    _y1=1.0/(1.0/_y1 + 1.0/dy);
    _y2=1.0/(1.0/_y2 - 1.0/dy);
    break;
  default:
    _y1-=dy;
    _y2+=dy;
    break;
  }
}
void QGpCoreTools::Rect::enlarge ( double  ratio,
SamplingOptions  xScale,
SamplingOptions  yScale 
)

Enlarges rectangle by width and height times ratio times in both directions.

References _x1, _x2, _y1, _y2, QGpCoreTools::InversedScale, QGpCoreTools::LogScale, and TRACE.

{
  TRACE;
  double s1, s2;
  switch(xScale) {
  case LogScale:
    s1=pow(_x2/_x1, ratio);
    _x1 /= s1;
    _x2 *= s1;
    break;
  case InversedScale:
    {
      double t1=1/_x1;
      double t2=1/_x2;
      s1=ratio*(t1-t2);
      _x1=1/(t1+s1);
      _x2=1/(t2-s1);
    }
    /*s1=ratio*(_x2-_x1);
    s2=_x1*_x2;
    _x1=s2/(_x2+s1);
    _x2=s2/(_x1-s1);*/
    break;
  default:
    s1=ratio*(_x2-_x1);
    _x1 -= s1;
    _x2 += s1;
    break;
  }
  switch(yScale) {
  case LogScale:
    s1=pow(_y2/_y1, ratio);
    _y1 /= s1;
    _y2 *= s1;
    break;
  case InversedScale:
    s1=ratio*(_y2-_y1);
    s2=_y1*_y2;
    _y1=s2/(_x2+s1);
    _y2=s2/(_x1-s1);
    break;
  default:
    s1=ratio*(_y2-_y1);
    _y1 -= s1;
    _y2 += s1;
    break;
  }
}
double QGpCoreTools::Rect::height ( ) const [inline]

Referenced by SciFigs::CircleMask::paintData(), and square().

{return _y2 -_y1;}
bool QGpCoreTools::Rect::includes ( const Rect r) const
bool QGpCoreTools::Rect::includes ( const Point p) const

Tests if the point is inside the rectangle

References _x1, _x2, _y1, _y2, TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().

{
  TRACE;
  return (_x1<=p.x() && p.x()<=_x2 && _y1<=p.y() && p.y()<=_y2);
}
bool QGpCoreTools::Rect::includes ( const Point2D p) const

Tests if the point is inside the rectangle

References _x1, _x2, _y1, _y2, TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().

{
  TRACE;
  return (_x1<=p.x() && p.x()<=_x2 && _y1<=p.y() && p.y()<=_y2);
}
bool QGpCoreTools::Rect::includes ( const Point2D p,
Area  inArea 
) const

Tests if the point is inside the speified area of the rectangle

References _x1, _x2, _y1, _y2, AboveAscDiag, AboveDescDiag, AllRect, BelowAscDiag, BelowDescDiag, TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().

{
  TRACE;
  bool inRect=(_x1 <= p.x() && p.x() <= _x2 && _y1 <= p.y() && p.y() <= _y2);
  if(!inRect) return false;
  double xLoc=(p.x()-_x1)/(_x2-_x1);
  double yLoc=(p.y()-_y1)/(_y2-_y1);
  switch (inArea) {
  case AllRect:
    return true;
  case AboveAscDiag:
    return yLoc>xLoc;
  case BelowAscDiag:
    return yLoc<xLoc;
  case AboveDescDiag:
    return yLoc>(1.0-xLoc);
  case BelowDescDiag:
    return yLoc<(1.0-xLoc);
  }
  return false;
}
bool QGpCoreTools::Rect::includes ( const Point2D p1,
const Point2D p2 
) const [inline]

Tests if the segment defined by p1 and p2 is inside or crosses the rectangle

References includes(), QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().

{
  return includes(p1.x(), p1.y(), p2.x(), p2.y());
}
bool QGpCoreTools::Rect::includes ( double  x1,
double  y1,
double  x2,
double  y2 
) const

Tests if the segment defined by x1, y1 and x2, y2 is inside or crosses the rectangle

References _x1, _x2, _y1, _y2, TRACE, x1(), and y1().

{
  TRACE;
  // One of the two points is inside the rectangle
  if((x1>_x1 && x1<_x2 && y1>_y1 && y1<_y2) ||
     (x2>_x1 && x2<_x2 && y2>_y1 && y2<_y2)) return true;
  // p1 and p2 are outside
  // Try to find one intersection with the sides of the rectangle
  if(x1!=x2) {                     // Intersections with vertical sides
    double coef=(y2-y1)/(x2-x1);
    double yi=y1+coef*(_x2-x1);
    if(_y1<=yi && yi<=_y2 &&
       ((x1<x2 && x1<=_x2 && _x2<=x2) ||
        (x1>x2 && x2<=_x2 && _x2<=x1))) return true;
    yi=y1+coef*(_x1-x1);
    if(_y1<=yi && yi<=_y2 &&
       ((x1<x2 && x1<=_x1 && _x1<=x2) ||
        (x1>x2 && x2<=_x1 && _x1<=x1))) return true;
  } else {                     // Segment is vertical, test if points are on both sides
    if(_x1<=x1 && x1<=_x2 &&
       ((y1<=y2 && y1<_y1 && y2>_y2) ||
        (y1>y2 && y2<_y1 && y1>_y2))) return true;
    else return false;
  }
  if(y1!=y2) {
    double coef=(x2-x1)/(y2-y1);
    double xi=x1+coef*(_y2-y1);
    if(_x1<=xi && xi<=_x2 &&
        ((y1<y2 && y1<=_y2 && _y2<=y2) ||
         (y1>y2 && y2<=_y2 && _y2<=y1))) return true;
    xi=x1+coef*(_y1-y1);
    if(_x1<=xi && xi<=_x2 &&
        ((y1<y2 && y1<=_y1 && _y1<=y2) ||
         (y1>y2 && y2<=_y1 && _y1<=y1))) return true;
  } else {
    if(_y1<=y1 && y1<=_y2 && 
        ((x1<=x2 && x1<_x1 && x2>_x2) ||
         (x1>x2 && x2<_x1 && x1>_x2))) return true;
    else return false;
  }
  return false;
}
Rect QGpCoreTools::Rect::intersect ( const Rect r) const

Find intersection rect between two rects

References _x1, _x2, _y1, _y2, and TRACE.

Referenced by SciFigs::AxisWindow::checkZoomRects(), SciFigs::ImageLayer::colorHistogram(), and SciFigs::ImageLayer::paintData().

{
  TRACE;
  Rect rint;
  if(_x1<r._x1) rint._x1=r._x1; else rint._x1=_x1;
  if(_y1<r._y1) rint._y1=r._y1; else rint._y1=_y1;
  if(_x2<r._x2) rint._x2=_x2; else rint._x2=r._x2;
  if(_y2<r._y2) rint._y2=_y2; else rint._y2=r._y2;
  if(rint._x1>rint._x2) {
    rint._x2=rint._x1;
  }
  if(rint._y1>rint._y2) {
    rint._y2=rint._y1;
  }
  return rint;
}
void QGpCoreTools::Rect::intersect ( Point p1,
Point p2 
) const

Finds intersection points between a rect and a segment

References _x1, _x2, _y1, _y2, QGpCoreTools::Point2D::setX(), QGpCoreTools::Point2D::setY(), TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().

{
  TRACE;
  Rect seg(p1.x(), p1.y(), p2.x(), p2.y());
  double c,dx,dy,x,y;
  dx=p2.x()-p1.x();
  dy=p2.y()-p1.y();
  if(fabs(dx)>1e-15) {
    c=dy/dx;
    y=p1.y()+c*(_x1-p1.x());
    if((y>=_y1 && y<=_y2) && (y>=seg._y1 && y<=seg._y2)) {
      if(p1.x()<=_x1) {p1.setX(_x1);p1.setY(y);}
      else {p2.setX(_x1);p2.setY(y);}
    }
    y=p1.y()+c*(_x2-p1.x());
    if((y>=_y1 && y<=_y2) && (y>=seg._y1 && y<=seg._y2)) {
      if(p1.x()>=_x2) {p1.setX(_x2);p1.setY(y);}
      else {p2.setX(_x2);p2.setY(y);}
    }
  }
  if(fabs(dy)>1e-15) {
    c=dx/dy;
    x=p1.x()+c*(_y1-p1.y());
    if((x>=_x1 && x<=_x2) && (x>=seg._x1 && x<=seg._x2)) {
      if(p1.y()<=_y1) {p1.setX(x);p1.setY(_y1);}
      else {p2.setX(x);p2.setY(_y1);}
    }
    x=p1.x()+c*(_y2-p1.y());
    if((x>=_x1 && x<=_x2) && (x>=seg._x1 && x<=seg._x2)) {
      if(p1.y()>=_y2) {p1.setX(x);p1.setY(_y2);}
      else {p2.setX(x);p2.setY(_y2);}
    }
  }
}
bool QGpCoreTools::Rect::isNull ( ) [inline]

References _x1, _x2, _y1, and _y2.

Referenced by Histogram2D::setValid().

{
  printf("(%lg,%lg) to (%lg,%lg)\n",_x1, _y1, _x2, _y2);
}
void QGpCoreTools::Rect::setLimits ( double  nx1,
double  ny1,
double  nx2,
double  ny2 
)

Adjust the top-left and the bottom-rigth corners to include the points (nx1, ny1) and (nx2, ny2).

References _x1, _x2, _y1, _y2, and TRACE.

Referenced by NAModelsPlot::boundingRect(), SciFigs::CircleViewer::boundingRect(), SciFigs::IrregularGrid2DPlot::boundingRect(), GeopsyGui::SignalLayer::boundingRect(), SciFigs::CircleViewer::Limits::Limits(), Rect(), QGpCoreTools::Segment2D::set(), and Simulator::setKmax().

{
  TRACE;
  double temp;
  _x1=nx1;
  _y1=ny1;
  _x2=nx2;
  _y2=ny2;
  if(_x2<_x1) {
    temp=_x2;
    _x2=_x1;
    _x1=temp;
  }
  if(_y2<_y1) {
    temp=_y2;
    _y2=_y1;
    _y1=temp;
  }
  /*if(_x2-_x1<1e-10) { // avoid minuscule rectangles
    _x2+=1e-10;
    _x1-=1e-10;
  }
  if(_y2-_y1<1e-10) {
    _y2+=1e-10;
    _y1-=1e-10;
  }*/
}
void QGpCoreTools::Rect::setX1 ( double  nx1)

References _x1, _x2, and TRACE.

{
  TRACE;
  double temp;
  _x1=nx1;
  if(_x2<_x1) {
    temp=_x2;
    _x2=_x1;
    _x1=temp;
  }
}
void QGpCoreTools::Rect::setX2 ( double  nx2)

References _x1, _x2, and TRACE.

{
  TRACE;
  double temp;
  _x2=nx2;
  if(_x2<_x1) {
    temp=_x2;
    _x2=_x1;
    _x1=temp;
  }
}
void QGpCoreTools::Rect::setY1 ( double  ny1)

References _y1, _y2, and TRACE.

{
  TRACE;
  double temp;
  _y1=ny1;
  if(_y2<_y1) {
    temp=_y2;
    _y2=_y1;
    _y1=temp;
  }
}
void QGpCoreTools::Rect::setY2 ( double  ny2)

References _y1, _y2, and TRACE.

{
  TRACE;
  double temp;
  _y2=ny2;
  if(_y2<_y1) {
    temp=_y2;
    _y2=_y1;
    _y1=temp;
  }
}

Sets identical width and heigh keeping the center at the same coordinates. The rectangle is always enlarged to the enclosing square.

References _x1, _x2, _y1, _y2, height(), TRACE, w, and width().

Referenced by PtMotionResults::setLimits().

{
  TRACE;
  double w=width();
  double h=height();
  if(w>h) {
    double dy=(w-h)*0.5;
    _y1-=dy;
    _y2+=dy;
  } else if(w<h) {
    double dx=(h-w)*0.5;
    _x1-=dx;
    _x2+=dx;
  } // else do nothing, already a square
}
{return Point2D(_x1, _y1);}
double QGpCoreTools::Rect::width ( ) const [inline]

Referenced by SciFigs::CircleMask::paintData(), and square().

{return _x2 -_x1;}
double QGpCoreTools::Rect::x1 ( ) const [inline]
double QGpCoreTools::Rect::x2 ( ) const [inline]

Re-implement this function to offer XML restore (children and properties) support to your class.

From tag and map (with contains the attibute value) return a unique identifier under the format of a XMLMember. XMLMember is initialized with 3 types of contructors:

  • An integer: id number of a property
  • A XMLClass * : a child of this object identified by tag
  • Default constructor: error, unknow child or property

Map of attributes can be inspected in this way (can be achived also in xml_setProperty()):

    static const QString tmp("childrenName");
    XMLRestoreAttributeIterator it=map.find(tmp);
    if(it!=map.end()) {
      // found attribute "childrenName"
    }

If the map of attributes is not used:

    Q_UNUSED(attributes);
    if(tag=="x1") return XMLMember(0);
    else if(tag=="y1") return XMLMember(1);
    else if(tag=="x2") return XMLMember(2);
    else if(tag=="y2") return XMLMember(3);
    else return XMLMember(XMLMember::Unknown);

Arithmetic operations + and - apply to XMLMember to avoid confusion of property id numbers between inherited objects. Offset 3 corresponds to the number of properties defined in this object.

    if(tag=="anInteger") return XMLMember(0);
    else if(tag=="aString") return XMLMember(1);
    else if(tag=="aDouble") return XMLMember(2);
    return AbstractLine::xml_member(tag, attributes, context)+3;

For the arguments of this function use Macro XML_MEMBER_ARGS.

Reimplemented from QGpCoreTools::XMLClass.

References TRACE, and QGpCoreTools::XMLMember::Unknown.

{
  TRACE;
  Q_UNUSED(attributes);
  Q_UNUSED(context);
  if(tag=="x1") return XMLMember(0);
  else if(tag=="y1") return XMLMember(1);
  else if(tag=="x2") return XMLMember(2);
  else if(tag=="y2") return XMLMember(3);
  else return XMLMember(XMLMember::Unknown);
}  

Re-implement this function to offer XML restore properties support to your class.

From memberID set the corresponding property with value content. The map of attributes is given as a supplementary information (not useful in all cases).

For a general case:

  Q_UNUSED(attributes);
  double val=content.toDouble();
  switch (memberID) {
  case 0:
    _x1=val;
    return true;
  case 1:
    _y1=val;
    return true;
  case 2:
    _x2=val;
    return true;
  case 3:
    _y2=val;
    return true;
  default:
    return false;
  }

For classes inheriting other classes (see also xml_member())

  switch (memberID) {
  case 0:
    _anInteger=content.toString();
    return true;
  case 1:
    _aString=content.toInt();
    return true;
  case 2:
    _aDouble=content.toDouble();
    return true;
  default:
    return AbstractLine::xml_setProperty(memberID-3, map, content);

For the arguments of this function use Macro XML_SETPROPERTY_ARGS.

Reimplemented from QGpCoreTools::XMLClass.

References _x1, _x2, _y1, _y2, and TRACE.

{
  TRACE;
  Q_UNUSED(tag);
  Q_UNUSED(attributes);
  Q_UNUSED(context);
  double val=content.toDouble();
  switch (memberID) {
  case 0:
    _x1=val;
    return true;
  case 1:
    _y1=val;
    return true;
  case 2:
    _x2=val;
    return true;
  case 3:
    _y2=val;
    return true;
  default:
    return false;
  }
}
virtual const QString& QGpCoreTools::Rect::xml_tagName ( ) const [inline, virtual]

Implements QGpCoreTools::XMLClass.

{return xmlRectTag;}

Reimplemented from QGpCoreTools::XMLClass.

References _x1, _x2, _y1, _y2, TRACE, and QGpCoreTools::XMLClass::writeProperty().

{
  TRACE;
  Q_UNUSED(context);
  writeProperty(s, "x",_x1);
  writeProperty(s, "y",_y1);
  writeProperty(s, "w",_x2-_x1);
  writeProperty(s, "h",_y2-_y1);
}
double QGpCoreTools::Rect::y1 ( ) const [inline]
double QGpCoreTools::Rect::y2 ( ) const [inline]

Member Data Documentation

double QGpCoreTools::Rect::_x1 [protected]
double QGpCoreTools::Rect::_x2 [protected]
double QGpCoreTools::Rect::_y1 [protected]
double QGpCoreTools::Rect::_y2 [protected]
const QString QGpCoreTools::Rect::xmlRectTag = "Rect" [static]

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