QGIS API Documentation
3.14.0-Pi (9f7028fd23)
|
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 );
556 QRectF viewBox = mSvgRenderer->viewBoxF();
557 QRectF r( mSvgOffset.x(), mSvgOffset.y(), viewBox.width(), viewBox.height() );
560 mSvgRenderer->render( p, r );
571 p->drawPolyline( pts );
579 if ( mPoints.isEmpty() )
589 double iconSize = ( mIconSize + 1 ) / 2.;
592 QRectF viewBox = mSvgRenderer->viewBoxF();
593 iconSize = std::max( std::fabs( mSvgOffset.x() ) + .5 * viewBox.width(), std::fabs( mSvgOffset.y() ) + .5 * viewBox.height() );
597 qreal w = ( ( mIconSize - 1 ) / 2 + mPen.width() );
600 for (
const QgsPolygonXY &poly : qgis::as_const( mPoints ) )
602 for (
const QgsPointXY &point : poly.at( 0 ) )
604 QgsPointXY p( point.x() + mTranslationOffsetX, point.y() + mTranslationOffsetY );
641 mTranslationOffsetX = dx;
642 mTranslationOffsetY = dy;
648 return mPoints.size();
653 if ( geometryIndex < 0 ||
654 geometryIndex >= mPoints.size() ||
655 mPoints.at( geometryIndex ).isEmpty() )
657 return mPoints.at( geometryIndex ).at( 0 ).size();
663 for (
const QgsPolygonXY &poly : qgis::as_const( mPoints ) )
667 count += ring.size();
675 if ( i < 0 || ringIndex < 0 || j < 0 ||
676 mPoints.size() <= i ||
677 mPoints.at( i ).size() <= ringIndex ||
678 mPoints.at( i ).at( ringIndex ).size() <= j )
681 return &mPoints[i][ringIndex][j];
688 switch ( mGeometryType )
700 for (
const QgsPolygonXY &poly : qgis::as_const( mPoints ) )
702 if ( poly.isEmpty() )
704 multiPoint.append( poly.at( 0 ) );
713 if ( !mPoints.isEmpty() )
715 if ( mPoints.size() > 1 )
718 for (
const QgsPolygonXY &poly : qgis::as_const( mPoints ) )
720 if ( poly.isEmpty() )
722 multiPolyline.append( poly.at( 0 ) );
728 if ( !mPoints.at( 0 ).isEmpty() )
int size() const
Returns number of geometries.
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.
static bool isMultiType(Type type)
Returns true if the WKB type is a multi type.
QgsWkbTypes::Type wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
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.
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.
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.
static GeometryType geometryType(Type type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
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.
const QgsMapToPixel * getCoordinateTransform()
Gets the current coordinate transform.
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.
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
@ ICON_CROSS
A cross is used to highlight points (+)
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.
double height() const
Returns the height of the rectangle.
IconType icon() const
Returns the current icon type to highlight point geometries.
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
void setIcon(IconType icon)
Sets the icon type to highlight point geometries.
QgsPolylineXY asPolyline() const
Returns the contents of the geometry as a polyline.
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 (◇)
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.
double width() const
Returns the width of the rectangle.
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.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
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.