mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-11-04 00:04:25 -05:00 
			
		
		
		
	Merge pull request #366 from matthias-kuhn/rubberband-point-symbols
Add different point symbols for QgsRubberband.
This commit is contained in:
		
						commit
						f815a72b6b
					
				@ -5,13 +5,35 @@ class QgsRubberBand: QgsMapCanvasItem
 | 
			
		||||
%End
 | 
			
		||||
 | 
			
		||||
  public:
 | 
			
		||||
    /** Icons
 | 
			
		||||
     *  Added in 1.9 */
 | 
			
		||||
    enum IconType
 | 
			
		||||
    {
 | 
			
		||||
      ICON_NONE,
 | 
			
		||||
      ICON_CROSS,
 | 
			
		||||
      ICON_X,
 | 
			
		||||
      ICON_BOX,
 | 
			
		||||
      ICON_CIRCLE
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    QgsRubberBand( QgsMapCanvas* mapCanvas /TransferThis/, QGis::GeometryType geometryType = QGis::Line );
 | 
			
		||||
    QgsRubberBand( QgsMapCanvas* mapCanvas /TransferThis/, bool isPolygon );
 | 
			
		||||
    ~QgsRubberBand();
 | 
			
		||||
 | 
			
		||||
    /** Set the color for the rubberband */
 | 
			
		||||
    void setColor( const QColor & color );
 | 
			
		||||
 | 
			
		||||
    /** Set the width of the line. Outline width for polygon. */
 | 
			
		||||
    void setWidth( int width );
 | 
			
		||||
 | 
			
		||||
    /** Set the icon type to highlight point geometries.
 | 
			
		||||
     *  Added in 1.9 */
 | 
			
		||||
    void setIcon( IconType icon );
 | 
			
		||||
 | 
			
		||||
    /** Set the size of the point icons
 | 
			
		||||
     *   Added in 1.9 */
 | 
			
		||||
    void setIconSize ( int iconSize );
 | 
			
		||||
 | 
			
		||||
    void reset( QGis::GeometryType geometryType = QGis::Line );
 | 
			
		||||
    void reset( bool isPolygon );
 | 
			
		||||
 | 
			
		||||
@ -30,6 +52,7 @@ class QgsRubberBand: QgsMapCanvasItem
 | 
			
		||||
 | 
			
		||||
    /**Sets this rubber band to the geometry of an existing feature.
 | 
			
		||||
     This is useful for feature highlighting.
 | 
			
		||||
     In contrast to addGeometry, this method does also change the geometry type of the rubberband.
 | 
			
		||||
    @param geom the geometry object
 | 
			
		||||
    @param layer the layer containing the feature, used for coord transformation to map
 | 
			
		||||
    crs. In case of 0 pointer, the coordinates are not going to be transformed.
 | 
			
		||||
 | 
			
		||||
@ -30,6 +30,8 @@
 | 
			
		||||
QgsRubberBand::QgsRubberBand( QgsMapCanvas* mapCanvas, QGis::GeometryType geometryType )
 | 
			
		||||
    : QgsMapCanvasItem( mapCanvas )
 | 
			
		||||
    , mWidth( 1 )
 | 
			
		||||
    , mIconSize( 5 )
 | 
			
		||||
    , mIconType( ICON_CIRCLE )
 | 
			
		||||
    , mGeometryType( geometryType )
 | 
			
		||||
    , mTranslationOffsetX( 0.0 )
 | 
			
		||||
    , mTranslationOffsetY( 0.0 )
 | 
			
		||||
@ -41,6 +43,8 @@ QgsRubberBand::QgsRubberBand( QgsMapCanvas* mapCanvas, QGis::GeometryType geomet
 | 
			
		||||
QgsRubberBand::QgsRubberBand( QgsMapCanvas* mapCanvas, bool isPolygon )
 | 
			
		||||
    : QgsMapCanvasItem( mapCanvas )
 | 
			
		||||
    , mWidth( 1 )
 | 
			
		||||
    , mIconSize( 5 )
 | 
			
		||||
    , mIconType( ICON_CIRCLE )
 | 
			
		||||
    , mTranslationOffsetX( 0.0 )
 | 
			
		||||
    , mTranslationOffsetY( 0.0 )
 | 
			
		||||
{
 | 
			
		||||
@ -75,6 +79,16 @@ void QgsRubberBand::setWidth( int width )
 | 
			
		||||
  mWidth = width;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QgsRubberBand::setIcon( IconType icon )
 | 
			
		||||
{
 | 
			
		||||
  mIconType = icon;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QgsRubberBand::setIconSize( int iconSize )
 | 
			
		||||
{
 | 
			
		||||
  mIconSize = iconSize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
  Remove all points from the shape being created.
 | 
			
		||||
  */
 | 
			
		||||
@ -189,7 +203,7 @@ void QgsRubberBand::movePoint( int index, const QgsPoint& p, int geometryIndex )
 | 
			
		||||
 | 
			
		||||
void QgsRubberBand::setToGeometry( QgsGeometry* geom, QgsVectorLayer* layer )
 | 
			
		||||
{
 | 
			
		||||
  reset( mGeometryType );
 | 
			
		||||
  reset( geom->type() );
 | 
			
		||||
  addGeometry( geom, layer );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -215,7 +229,6 @@ void QgsRubberBand::addGeometry( QgsGeometry* geom, QgsVectorLayer* layer )
 | 
			
		||||
    case QGis::WKBPoint:
 | 
			
		||||
    case QGis::WKBPoint25D:
 | 
			
		||||
    {
 | 
			
		||||
      double d = mMapCanvas->extent().width() * 0.005;
 | 
			
		||||
      QgsPoint pt;
 | 
			
		||||
      if ( layer )
 | 
			
		||||
      {
 | 
			
		||||
@ -225,34 +238,24 @@ void QgsRubberBand::addGeometry( QgsGeometry* geom, QgsVectorLayer* layer )
 | 
			
		||||
      {
 | 
			
		||||
        pt = geom->asPoint();
 | 
			
		||||
      }
 | 
			
		||||
      addPoint( QgsPoint( pt.x() - d, pt.y() - d ), false, idx );
 | 
			
		||||
      addPoint( QgsPoint( pt.x() + d, pt.y() - d ), false, idx );
 | 
			
		||||
      addPoint( QgsPoint( pt.x() + d, pt.y() + d ), false, idx );
 | 
			
		||||
      addPoint( QgsPoint( pt.x() - d, pt.y() + d ), false, idx );
 | 
			
		||||
      addPoint( pt, false, idx );
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
    case QGis::WKBMultiPoint:
 | 
			
		||||
    case QGis::WKBMultiPoint25D:
 | 
			
		||||
    {
 | 
			
		||||
      double d = mMapCanvas->extent().width() * 0.005;
 | 
			
		||||
      QgsMultiPoint mpt = geom->asMultiPoint();
 | 
			
		||||
      for ( int i = 0; i < mpt.size(); ++i, ++idx )
 | 
			
		||||
      {
 | 
			
		||||
        QgsPoint pt = mpt[i];
 | 
			
		||||
        if ( layer )
 | 
			
		||||
        {
 | 
			
		||||
          addPoint( mr->layerToMapCoordinates( layer, QgsPoint( pt.x() - d, pt.y() - d ) ), false, idx );
 | 
			
		||||
          addPoint( mr->layerToMapCoordinates( layer, QgsPoint( pt.x() + d, pt.y() - d ) ), false, idx );
 | 
			
		||||
          addPoint( mr->layerToMapCoordinates( layer, QgsPoint( pt.x() + d, pt.y() + d ) ), false, idx );
 | 
			
		||||
          addPoint( mr->layerToMapCoordinates( layer, QgsPoint( pt.x() - d, pt.y() + d ) ), false, idx );
 | 
			
		||||
          addPoint( mr->layerToMapCoordinates( layer, pt ), false, idx );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
          addPoint( QgsPoint( pt.x() - d, pt.y() - d ), false, idx );
 | 
			
		||||
          addPoint( QgsPoint( pt.x() + d, pt.y() - d ), false, idx );
 | 
			
		||||
          addPoint( QgsPoint( pt.x() + d, pt.y() + d ), false, idx );
 | 
			
		||||
          addPoint( QgsPoint( pt.x() - d, pt.y() + d ), false, idx );
 | 
			
		||||
          addPoint( pt, false, idx );
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
@ -386,6 +389,8 @@ void QgsRubberBand::paint( QPainter* p )
 | 
			
		||||
  if ( mPoints.size() > 0 )
 | 
			
		||||
  {
 | 
			
		||||
    p->setBrush( mBrush );
 | 
			
		||||
    mPen.setWidth( mWidth );
 | 
			
		||||
    p->setPen( mPen );
 | 
			
		||||
 | 
			
		||||
    for ( int i = 0; i < mPoints.size(); ++i )
 | 
			
		||||
    {
 | 
			
		||||
@ -400,20 +405,46 @@ void QgsRubberBand::paint( QPainter* p )
 | 
			
		||||
      {
 | 
			
		||||
        case QGis::Polygon:
 | 
			
		||||
        {
 | 
			
		||||
          mPen.setWidth( mWidth );
 | 
			
		||||
          p->setPen( mPen );
 | 
			
		||||
          p->drawPolygon( pts );
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
        case QGis::Point:
 | 
			
		||||
        {
 | 
			
		||||
          mPen.setWidth( 1 );
 | 
			
		||||
          p->setPen( mPen );
 | 
			
		||||
          QVector<QPointF>::const_iterator ptIt = pts.constBegin();
 | 
			
		||||
          for ( ; ptIt != pts.constEnd(); ++ptIt )
 | 
			
		||||
          {
 | 
			
		||||
            p->drawEllipse(( *ptIt ).x() - mWidth / 2, ( *ptIt ).y() - mWidth / 2, mWidth, mWidth );
 | 
			
		||||
            double x = (*ptIt).x();
 | 
			
		||||
            double y = (*ptIt).y();
 | 
			
		||||
 | 
			
		||||
            qreal s = ( mIconSize - 1 ) / 2;
 | 
			
		||||
 | 
			
		||||
            switch ( mIconType )
 | 
			
		||||
            {
 | 
			
		||||
              case ICON_NONE:
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
              case ICON_CROSS:
 | 
			
		||||
                p->drawLine( QLineF( x - s, y, x + s, y ) );
 | 
			
		||||
                p->drawLine( QLineF( x, y - s, x, y + s ) );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
              case ICON_X:
 | 
			
		||||
                p->drawLine( QLineF( x - s, y - s, x + s, y + s ) );
 | 
			
		||||
                p->drawLine( QLineF( x - s, y + s, x + s, y - s ) );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
              case ICON_BOX:
 | 
			
		||||
                p->drawLine( QLineF( x - s, y - s, x + s, y - s ) );
 | 
			
		||||
                p->drawLine( QLineF( x + s, y - s, x + s, y + s ) );
 | 
			
		||||
                p->drawLine( QLineF( x + s, y + s, x - s, y + s ) );
 | 
			
		||||
                p->drawLine( QLineF( x - s, y + s, x - s, y - s ) );
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
              case ICON_CIRCLE:
 | 
			
		||||
                p->drawEllipse( x - s, y - s, mIconSize, mIconSize );
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
@ -421,8 +452,6 @@ void QgsRubberBand::paint( QPainter* p )
 | 
			
		||||
        case QGis::Line:
 | 
			
		||||
        default:
 | 
			
		||||
        {
 | 
			
		||||
          mPen.setWidth( mWidth );
 | 
			
		||||
          p->setPen( mPen );
 | 
			
		||||
          p->drawPolyline( pts );
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
@ -449,7 +478,11 @@ void QgsRubberBand::updateRect()
 | 
			
		||||
      QList<QgsPoint>::const_iterator it = mPoints.at( i ).constBegin();
 | 
			
		||||
      for ( ; it != mPoints.at( i ).constEnd(); ++it )
 | 
			
		||||
      {
 | 
			
		||||
        r.combineExtentWith( it->x() + mTranslationOffsetX, it->y() + mTranslationOffsetY );
 | 
			
		||||
        qreal s = ( mIconSize - 1 ) / 2;
 | 
			
		||||
        qreal p = mWidth;
 | 
			
		||||
        QgsRectangle rect = QgsRectangle( it->x() + mTranslationOffsetX - s - p, it->y() + mTranslationOffsetY - s - p,
 | 
			
		||||
                                          it->x() + mTranslationOffsetX + s + p, it->y() + mTranslationOffsetY + s + p);
 | 
			
		||||
        r.combineExtentWith( &rect );
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    setRect( r );
 | 
			
		||||
 | 
			
		||||
@ -31,6 +31,18 @@ class QPaintEvent;
 | 
			
		||||
class GUI_EXPORT QgsRubberBand: public QgsMapCanvasItem
 | 
			
		||||
{
 | 
			
		||||
  public:
 | 
			
		||||
 | 
			
		||||
    /** Icons
 | 
			
		||||
     *  Added in 1.9 */
 | 
			
		||||
    enum IconType
 | 
			
		||||
    {
 | 
			
		||||
      ICON_NONE,
 | 
			
		||||
      ICON_CROSS,
 | 
			
		||||
      ICON_X,
 | 
			
		||||
      ICON_BOX,
 | 
			
		||||
      ICON_CIRCLE
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new RubberBand.
 | 
			
		||||
     * @param mapCanvas The map canvas to draw onto. It's CRS will be used map points onto screen coordinates.
 | 
			
		||||
@ -47,9 +59,20 @@ class GUI_EXPORT QgsRubberBand: public QgsMapCanvasItem
 | 
			
		||||
    QgsRubberBand( QgsMapCanvas* mapCanvas, bool isPolygon );
 | 
			
		||||
    ~QgsRubberBand();
 | 
			
		||||
 | 
			
		||||
    /** Set the color for the rubberband */
 | 
			
		||||
    void setColor( const QColor & color );
 | 
			
		||||
 | 
			
		||||
    /** Set the width of the line. Outline width for polygon. */
 | 
			
		||||
    void setWidth( int width );
 | 
			
		||||
 | 
			
		||||
    /** Set the icon type to highlight point geometries.
 | 
			
		||||
     *  Added in 1.9 */
 | 
			
		||||
    void setIcon( IconType icon );
 | 
			
		||||
 | 
			
		||||
    /** Set the size of the point icons
 | 
			
		||||
      *  Added in 1.9 */
 | 
			
		||||
    void setIconSize ( int iconSize );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Clears all the geometries in this rubberband.
 | 
			
		||||
     * Sets the representation type according to geometryType.
 | 
			
		||||
@ -80,6 +103,7 @@ class GUI_EXPORT QgsRubberBand: public QgsMapCanvasItem
 | 
			
		||||
 | 
			
		||||
    /**Sets this rubber band to the geometry of an existing feature.
 | 
			
		||||
     This is useful for feature highlighting.
 | 
			
		||||
     In contrast to addGeometry, this method does also change the geometry type of the rubberband.
 | 
			
		||||
    @param geom the geometry object
 | 
			
		||||
    @param layer the layer containing the feature, used for coord transformation to map
 | 
			
		||||
    crs. In case of 0 pointer, the coordinates are not going to be transformed.
 | 
			
		||||
@ -127,8 +151,17 @@ class GUI_EXPORT QgsRubberBand: public QgsMapCanvasItem
 | 
			
		||||
    QBrush mBrush;
 | 
			
		||||
    QPen mPen;
 | 
			
		||||
 | 
			
		||||
    /** The width of any line within the rubberband. */
 | 
			
		||||
    int mWidth;
 | 
			
		||||
 | 
			
		||||
    /** The size of the icon for points.
 | 
			
		||||
      * Added in 1.9 */
 | 
			
		||||
    int mIconSize;
 | 
			
		||||
 | 
			
		||||
    /** Icon to be shown.
 | 
			
		||||
     *  Added in 1.9 */
 | 
			
		||||
    IconType mIconType ;
 | 
			
		||||
 | 
			
		||||
    /**Nested lists used for multitypes*/
 | 
			
		||||
    QList< QList <QgsPoint> > mPoints;
 | 
			
		||||
    QGis::GeometryType mGeometryType;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user