QGIS API Documentation
3.16.0-Hannover (43b64b13f3)
|
Go to the documentation of this file.
28 , mGeometryType( geometryType )
30 reset( geometryType );
31 QColor color( Qt::lightGray );
40 QgsRubberBand::QgsRubberBand()
54 if ( mBrush.color() == color )
57 mBrush.setColor( color );
62 mPen.setColor( color );
67 mSecondaryPen.setColor( color );
72 mPen.setWidth(
width );
83 mSvgRenderer = qgis::make_unique<QSvgRenderer>( path );
84 mSvgOffset = drawOffset;
94 mPen.setStyle( penStyle );
99 mBrush.setStyle( brushStyle );
105 mGeometryType = geometryType;
112 if ( geometryIndex < 0 )
114 geometryIndex = mPoints.size() - 1;
117 if ( geometryIndex < 0 || geometryIndex > mPoints.size() )
122 if ( geometryIndex == mPoints.size() )
133 if ( mPoints.at( geometryIndex ).isEmpty() )
136 ringIndex = mPoints.at( geometryIndex ).size() - 1;
139 if ( ringIndex > mPoints.at( geometryIndex ).size() )
142 if ( ringIndex == mPoints.at( geometryIndex ).size() )
145 mPoints[geometryIndex][ringIndex].append( p );
148 if ( mPoints.at( geometryIndex ).at( ringIndex ).size() == 2 &&
149 mPoints.at( geometryIndex ).at( ringIndex ).at( 0 ) == mPoints.at( geometryIndex ).at( ringIndex ).at( 1 ) )
151 mPoints[geometryIndex][ringIndex].last() = p;
155 mPoints[geometryIndex][ringIndex].append( p );
169 if ( geometryIndex < 0 || ringIndex < 0 ||
170 mPoints.size() <= geometryIndex ||
171 mPoints.at( geometryIndex ).size() <= ringIndex ||
172 mPoints.at( geometryIndex ).at( ringIndex ).isEmpty() )
177 if ( mPoints.at( geometryIndex ).at( ringIndex ).constFirst() != mPoints.at( geometryIndex ).at( ringIndex ).constLast() )
179 mPoints[geometryIndex][ringIndex].append( mPoints.at( geometryIndex ).at( ringIndex ).constFirst() );
194 if ( geometryIndex < 0 || ringIndex < 0 ||
195 mPoints.size() <= geometryIndex ||
196 mPoints.at( geometryIndex ).size() <= ringIndex ||
197 mPoints.at( geometryIndex ).at( ringIndex ).size() <= index ||
198 mPoints.at( geometryIndex ).at( ringIndex ).size() < -index ||
199 mPoints.at( geometryIndex ).at( ringIndex ).isEmpty() )
207 index = mPoints.at( geometryIndex ).at( ringIndex ).size() + index;
209 mPoints[geometryIndex][ringIndex].removeAt( index );
220 removePoint( -1, doUpdate, geometryIndex, ringIndex );
225 if ( geometryIndex < 0 || ringIndex < 0 ||
226 mPoints.size() <= geometryIndex ||
227 mPoints.at( geometryIndex ).size() <= ringIndex ||
228 mPoints.at( geometryIndex ).at( ringIndex ).isEmpty() )
233 mPoints[geometryIndex][ringIndex].last() = p;
241 if ( geometryIndex < 0 || ringIndex < 0 || index < 0 ||
242 mPoints.size() <= geometryIndex ||
243 mPoints.at( geometryIndex ).size() <= ringIndex ||
244 mPoints.at( geometryIndex ).at( ringIndex ).size() <= index )
249 mPoints[geometryIndex][ringIndex][index] = p;
259 reset( mGeometryType );
271 reset( mGeometryType );
308 int idx = mPoints.size();
347 if ( line.isEmpty() )
366 addPoint( pt,
false, idx, ringIdx );
376 if ( poly.isEmpty() )
384 addPoint( pt,
false, idx, ringIdx );
423 if ( mPoints.isEmpty() )
426 QVector< QVector<QPolygonF> > shapes;
427 shapes.reserve( mPoints.size() );
428 for (
const QgsPolygonXY &poly : qgis::as_const( mPoints ) )
430 QVector<QPolygonF> rings;
431 rings.reserve( poly.size() );
434 QVector<QPointF> pts;
435 pts.reserve( line.size() );
439 if ( pts.isEmpty() || std::abs( pts.last().x() - cur.x() ) > 1 || std::abs( pts.last().y() - cur.y() ) > 1 )
444 shapes.append( rings );
447 int iterations = mSecondaryPen.color().isValid() ? 2 : 1;
448 for (
int i = 0; i < iterations; ++i )
450 if ( i == 0 && iterations > 1 )
453 mSecondaryPen.setWidth( mPen.width() + 2 );
454 p->setBrush( Qt::NoBrush );
455 p->setPen( mSecondaryPen );
460 p->setBrush( mBrush );
464 for (
const QVector<QPolygonF> &shape : qgis::as_const( shapes ) )
473 if ( rings.size() == 1 )
480 for (
const QPolygonF &poly : rings )
482 path.addPolygon( poly );
490 switch ( mGeometryType )
494 p->drawPolygon( pts );
500 const auto constPts = pts;
501 for ( QPointF pt : constPts )
506 qreal s = ( mIconSize - 1 ) / 2.0;
514 p->drawLine( QLineF( x - s, y, x + s, y ) );
515 p->drawLine( QLineF( x, y - s, x, y + s ) );
519 p->drawLine( QLineF( x - s, y - s, x + s, y + s ) );
520 p->drawLine( QLineF( x - s, y + s, x + s, y - s ) );
524 p->drawLine( QLineF( x - s, y - s, x + s, y - s ) );
525 p->drawLine( QLineF( x + s, y - s, x + s, y + s ) );
526 p->drawLine( QLineF( x + s, y + s, x - s, y + s ) );
527 p->drawLine( QLineF( x - s, y + s, x - s, y - s ) );
531 p->drawRect(
static_cast< int>( x - s ),
static_cast< int >( y - s ), mIconSize, mIconSize );
535 p->drawEllipse(
static_cast< int >( x - s ),
static_cast< int >( y - s ), mIconSize, mIconSize );
549 p->drawPolygon( pts, 4 );
551 p->drawPolyline( pts, 4 );
557 QRectF viewBox = mSvgRenderer->viewBoxF();
558 QRectF r( mSvgOffset.x(), mSvgOffset.y(), viewBox.width(), viewBox.height() );
561 mSvgRenderer->render( p, r );
572 p->drawPolyline( pts );
580 if ( mPoints.isEmpty() )
590 double iconSize = ( mIconSize + 1 ) / 2.;
593 QRectF viewBox = mSvgRenderer->viewBoxF();
594 iconSize = std::max( std::fabs( mSvgOffset.x() ) + .5 * viewBox.width(), std::fabs( mSvgOffset.y() ) + .5 * viewBox.height() );
598 qreal w = ( ( mIconSize - 1 ) / 2 + mPen.width() );
601 for (
const QgsPolygonXY &poly : qgis::as_const( mPoints ) )
603 for (
const QgsPointXY &point : poly.at( 0 ) )
605 QgsPointXY p( point.x() + mTranslationOffsetX, point.y() + mTranslationOffsetY );
642 mTranslationOffsetX = dx;
643 mTranslationOffsetY = dy;
649 return mPoints.size();
654 if ( geometryIndex < 0 ||
655 geometryIndex >= mPoints.size() ||
656 mPoints.at( geometryIndex ).isEmpty() )
658 return mPoints.at( geometryIndex ).at( 0 ).size();
664 for (
const QgsPolygonXY &poly : qgis::as_const( mPoints ) )
668 count += ring.size();
676 if ( i < 0 || ringIndex < 0 || j < 0 ||
677 mPoints.size() <= i ||
678 mPoints.at( i ).size() <= ringIndex ||
679 mPoints.at( i ).at( ringIndex ).size() <= j )
682 return &mPoints[i][ringIndex][j];
689 switch ( mGeometryType )
701 for (
const QgsPolygonXY &poly : qgis::as_const( mPoints ) )
703 if ( poly.isEmpty() )
705 multiPoint.append( poly.at( 0 ) );
714 if ( !mPoints.isEmpty() )
716 if ( mPoints.size() > 1 )
719 for (
const QgsPolygonXY &poly : qgis::as_const( mPoints ) )
721 if ( poly.isEmpty() )
723 multiPolyline.append( poly.at( 0 ) );
729 if ( !mPoints.at( 0 ).isEmpty() )
int size() const
Returns number of geometries.
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
OperationResult transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection direction=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
void removePoint(int index=0, bool doUpdate=true, int geometryIndex=0, int ringIndex=0)
Removes a vertex from the rubberband and (optionally) updates canvas.
void setSvgIcon(const QString &path, QPoint drawOffset)
Set the path to the svg file to use to draw points.
double mapUnitsPerPixel() const
Returns current map units per pixel.
@ ICON_CIRCLE
A circle is used to highlight points (○)
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle.
QgsCoordinateTransform layerTransform(const QgsMapLayer *layer) const
Returns the coordinate transform from layer's CRS to destination CRS.
QVector< QgsPolylineXY > QgsPolygonXY
Polygon: first item of the list is outer ring, inner rings (if any) start from second item.
static QgsGeometry fromPolylineXY(const QgsPolylineXY &polyline)
Creates a new LineString geometry from a list of QgsPointXY points.
QgsMapCanvas * mMapCanvas
pointer to map canvas
void updatePosition() override
called on changed extent or resize event to update position of the item
static QgsGeometry fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Creates a new geometry from a QgsMultiPolylineXY object.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
void removeLastPoint(int geometryIndex=0, bool doUpdate=true, int ringIndex=0)
Removes the last point.
void setIconSize(int iconSize)
Sets the size of the point icons.
const QgsCoordinateReferenceSystem & crs
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
Map canvas is a class for displaying all GIS data types on a canvas.
const QgsPointXY * getPoint(int i, int j=0, int ringIndex=0) const
Returns a vertex.
static QgsProject * instance()
Returns the QgsProject singleton instance.
void setStrokeColor(const QColor &color)
Sets the stroke color for the rubberband.
QVector< QgsPolygonXY > QgsMultiPolygonXY
A collection of QgsPolygons that share a common collection of attributes.
void setFillColor(const QColor &color)
Sets the fill color for the rubberband.
@ ICON_BOX
A box is used to highlight points (□)
Type
The WKB type describes the number of dimensions a geometry has.
QgsPointXY toMapCoordinates(int x, int y) const
Transform device coordinates to map (world) coordinates.
void movePoint(const QgsPointXY &p, int geometryIndex=0, int ringIndex=0)
Moves the rubber band point specified by index.
A rectangle specified with double values.
QgsMultiPolylineXY asMultiPolyline() const
Returns the contents of the geometry as a multi-linestring.
@ ICON_NONE
No icon is used.
QVector< QgsPointXY > QgsMultiPointXY
A collection of QgsPoints that share a common collection of attributes.
void reset(QgsWkbTypes::GeometryType geometryType=QgsWkbTypes::LineGeometry)
Clears all the geometries in this rubberband.
QSize iconSize(bool dockableToolbar)
Returns the user-preferred size of a window's toolbar icons.
void setRect(const QgsRectangle &r, bool resetRotation=true)
sets canvas item rectangle in map units
@ ICON_FULL_DIAMOND
A diamond is used to highlight points (◆)
QgsPolygonXY asPolygon() const
Returns the contents of the geometry as a polygon.
Custom exception class for Coordinate Reference System related exceptions.
An abstract class for items that can be placed on the map canvas.
QPointF toCanvasCoordinates(const QgsPointXY &point) const
transformation from map coordinates to screen coordinates
static QgsGeometry fromMultiPointXY(const QgsMultiPointXY &multipoint)
Creates a new geometry from a QgsMultiPointXY object.
void setTranslationOffset(double dx, double dy)
Adds translation to original coordinates (all in map coordinates)
void updateRect()
Recalculates needed rectangle.
void setColor(const QColor &color)
Sets the color for the rubberband.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QVector< QgsPolylineXY > QgsMultiPolylineXY
A collection of QgsPolylines that share a common collection of attributes.
int numberOfVertices() const
Returns count of vertices in all lists of mPoint.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
@ ICON_X
A cross is used to highlight points (x)
void addPoint(const QgsPointXY &p, bool doUpdate=true, int geometryIndex=0, int ringIndex=0)
Adds a vertex to the rubberband and update canvas.
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
Scoped object for saving and restoring a QPainter object's state.
const QgsMapToPixel * getCoordinateTransform()
Gets the current coordinate transform.
This class represents a coordinate reference system (CRS).
QgsPointXY transform(const QgsPointXY &p) const
Transform the point from map (world) coordinates to device coordinates.
void drawShape(QPainter *p, const QVector< QPointF > &pts)
Draws shape of the rubber band.
@ ICON_FULL_BOX
A full box is used to highlight points (■)
void paint(QPainter *p) override
Paints the rubber band in response to an update event.
void setLineStyle(Qt::PenStyle penStyle)
Sets the style of the line.
A class to represent a 2D point.
QgsCoordinateReferenceSystem destinationCrs() const
returns CRS of destination coordinate reference system
QgsRubberBand(QgsMapCanvas *mapCanvas, QgsWkbTypes::GeometryType geometryType=QgsWkbTypes::LineGeometry)
Creates a new RubberBand.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
void setWidth(int width)
Sets the width of the line.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
QgsRectangle rect() const
returns canvas item rectangle in map units
A geometry is the spatial representation of a feature.
Perform transforms between map coordinates and device coordinates.
@ ICON_CROSS
A cross is used to highlight points (+)
Represents a vector layer which manages a vector based data sets.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
void addGeometry(const QgsGeometry &geometry, QgsVectorLayer *layer)
Adds the geometry of an existing feature to a rubberband This is useful for multi feature highlightin...
void setToCanvasRectangle(QRect rect)
Sets this rubber band to a map canvas rectangle.
IconType icon() const
Returns the current icon type to highlight point geometries.
void setIcon(IconType icon)
Sets the icon type to highlight point geometries.
QgsPolylineXY asPolyline() const
Returns the contents of the geometry as a polyline.
static GeometryType geometryType(Type type) SIP_HOLDGIL
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
QgsMultiPointXY asMultiPoint() const
Returns the contents of the geometry as a multi-point.
void setToGeometry(const QgsGeometry &geom, QgsVectorLayer *layer)
Sets this rubber band to geom.
@ ICON_SVG
An svg image is used to highlight points.
int partSize(int geometryIndex) const
Returns number of vertices in feature part.
@ ICON_DIAMOND
A diamond is used to highlight points (◇)
The QgsMapSettings class contains configuration for rendering of the map.
static bool isMultiType(Type type) SIP_HOLDGIL
Returns true if the WKB type is a multi type.
QgsWkbTypes::GeometryType type
void setSecondaryStrokeColor(const QColor &color)
Sets a secondary stroke color for the rubberband which will be drawn under the main stroke color.
bool isEmpty() const
Returns true if the rectangle is empty.
void setBrushStyle(Qt::BrushStyle brushStyle)
Sets the style of the brush.
QgsGeometry asGeometry() const
Returns the rubberband as a Geometry.
void closePoints(bool doUpdate=true, int geometryIndex=0, int ringIndex=0)
Ensures that a polygon geometry is closed and that the last vertex equals the first vertex.
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
static QgsGeometry fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Creates a new geometry from a QgsMultiPolygon.
QgsMultiPolygonXY asMultiPolygon() const
Returns the contents of the geometry as a multi-polygon.