25#include "moc_qgshighlight.cpp"
70void QgsHighlight::init()
72 mOriginalGeometry = mGeometry.
isNull() ? mFeature.
geometry() : mGeometry;
76 updateTransformedGeometry();
80 mRenderContext = createRenderContext();
84void QgsHighlight::updateTransformedGeometry()
93 mGeometry = mOriginalGeometry;
100 QgsDebugError( QStringLiteral(
"Could not transform highlight geometry to canvas CRS" ) );
112 mPen.setColor(
color );
115 mBrush.setStyle( Qt::SolidPattern );
122 mBrush.setStyle( Qt::SolidPattern );
125std::unique_ptr<QgsFeatureRenderer> QgsHighlight::createRenderer(
QgsRenderContext &context,
const QColor &color,
const QColor &fillColor )
127 std::unique_ptr<QgsFeatureRenderer> renderer;
146void QgsHighlight::setSymbol(
QgsSymbol *symbol,
const QgsRenderContext &context,
const QColor &color,
const QColor &fillColor )
197 width = std::max(
width + 2 * mBuffer * scale, mMinWidth * scale );
204 mPen.setWidth(
width );
218 case QgsHighlight::Square:
220 const double xMax = xMin + 2 * radius;
221 const double yMax = yMin + 2 * radius;
222 QPolygonF r( QVector<QPointF> { QPointF( xMin, yMin ),
223 QPointF( xMax, yMin ),
224 QPointF( xMax, yMax ),
225 QPointF( xMin, yMax ),
226 QPointF( xMin, yMin )
228 context.
painter()->drawPolygon( r );
232 case QgsHighlight::Circle:
234 context.
painter()->drawEllipse( QRectF( xMin, yMin, radius * 2, radius * 2 ) );
240void QgsHighlight::paintLine( QPainter *p,
QgsPolylineXY line )
242 QPolygonF polygon( line.size() );
244 for (
int i = 0; i < line.size(); i++ )
249 p->drawPolyline( polygon );
252void QgsHighlight::paintPolygon( QPainter *p,
const QgsPolygonXY &polygon )
258 p->setBrush( mBrush );
260 for (
const auto &sourceRing : polygon )
262 if ( sourceRing.empty() )
266 ring.reserve( sourceRing.size() + 1 );
269 for (
const auto &sourceVertex : sourceRing )
273 if ( ring.isEmpty() || std::abs( ring.back().x() - curVertex.x() ) > 1 || std::abs( ring.back().y() - curVertex.y() ) > 1 )
275 ring.push_back( curVertex );
277 lastVertex = curVertex;
280 ring.push_back( ring.at( 0 ) );
282 path.addPolygon( ring );
303 mRenderContext = createRenderContext();
318 color.setAlpha( alpha );
328 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayer );
336 if ( layerToCanvasTransform.
isValid() )
346 QgsDebugError( QStringLiteral(
"Error transforming canvas extent to layer CRS" ) );
349 if ( !mapExtentInLayerCrs.
isFinite() )
353 context.
setExtent( mapExtentInLayerCrs );
358 QColor tmpColor( 255, 0, 0, 255 );
359 QColor tmpFillColor( 0, 255, 0, 255 );
361 std::unique_ptr< QgsFeatureRenderer > renderer = createRenderer( context, tmpColor, tmpFillColor );
366 QImage image = QImage( imageSize.width(), imageSize.height(), QImage::Format_ARGB32 );
368 QPainter imagePainter( &image );
369 imagePainter.setRenderHint( QPainter::Antialiasing,
true );
372 renderer->startRender( context, mFeature.
fields() );
374 renderer->renderFeature( mFeature, context );
375 renderer->stopRender( context );
380 int penRed = mPen.color().red();
381 int penGreen = mPen.color().green();
382 int penBlue = mPen.color().blue();
384 double k = ( 255. - mBrush.color().alpha() ) / 255.;
385 QRgb *line =
nullptr;
386 const int height = image.height();
387 const int width = image.width();
388 for (
int r = 0; r < height; r++ )
390 line =
reinterpret_cast<QRgb *
>( image.scanLine( r ) );
393 int alpha = qAlpha( line[
c] );
396 int green = qGreen( line[
c] );
397 line[
c] = qRgba( penRed, penGreen, penBlue, std::clamp(
static_cast< int >( alpha - ( green * k ) ), 30, 255 ) );
402 p->drawImage( 0, 0, image );
405 else if ( !mGeometry.
isNull() )
408 p->setBrush( mBrush );
410 switch ( mGeometry.
type() )
417 double pointSizeRadius = mPointSizeRadiusMM;
419 PointSymbol symbol = mPointSymbol;
426 pointSizeRadius = 1.2 * 0.5 * mRenderContext.
convertToPainterUnits( pcRenderer->pointSize(), pcRenderer->pointSizeUnit(), pcRenderer->pointSizeMapUnitScale() );
428 switch ( pcRenderer->pointSymbol() )
442 paintPoint( mRenderContext, qgsgeometry_cast< const QgsPoint *>( *it ), pointSizeRadius, sizeUnit, symbol );
457 for (
int i = 0; i < m.size(); i++ )
459 paintLine( p, m[i] );
469 paintPolygon( p, mGeometry.
asPolygon() );
474 for (
int i = 0; i < m.size(); i++ )
476 paintPolygon( p, m[i] );
491 if ( qobject_cast<QgsPointCloudLayer *>( mLayer ) || mFeature.
hasGeometry() )
504 QgsRectangle rect( topLeft.
x(), topLeft.
y(), topLeft.
x() + imageSize.width()*res, topLeft.
y() - imageSize.height()*res );
509 else if ( !mGeometry.
isNull() )
@ Circle
Renders points as circles.
@ Square
Renders points as squares.
static const double DEFAULT_HIGHLIGHT_MIN_WIDTH_MM
Default highlight line/stroke minimum width in mm.
static const double DEFAULT_HIGHLIGHT_BUFFER_MM
Default highlight buffer in mm.
static const QColor DEFAULT_HIGHLIGHT_COLOR
Default highlight color.
RenderUnit
Rendering size units.
@ Millimeters
Millimeters.
@ Reverse
Reverse/inverse transform (from destination to source)
Custom exception class for Coordinate Reference System related exceptions.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
bool hasGeometry() const
Returns true if the feature has an associated geometry.
A geometry is the spatial representation of a feature.
QgsMultiPolygonXY asMultiPolygon() const
Returns the contents of the geometry as a multi-polygon.
QgsAbstractGeometry::const_part_iterator const_parts_begin() const
Returns STL-style const iterator pointing to the first part of the geometry.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
QgsPolygonXY asPolygon() const
Returns the contents of the geometry as a polygon.
QgsPolylineXY asPolyline() const
Returns the contents of the geometry as a polyline.
QgsMultiPolylineXY asMultiPolyline() const
Returns the contents of the geometry as a multi-linestring.
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type.
QgsAbstractGeometry::const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
void updatePosition() override
called on changed extent or resize event to update position of the item
QgsMapLayer * layer() const
Returns the layer for which this highlight has been created.
QgsHighlight(QgsMapCanvas *mapCanvas, const QgsGeometry &geom, QgsMapLayer *layer)
Constructor for QgsHighlight.
void setBuffer(double buffer)
Set line / stroke buffer in millimeters.
void setMinWidth(double width)
Set minimum line / stroke width in millimeters.
void setFillColor(const QColor &fillColor)
Fill color for the highlight.
void applyDefaultStyle()
Applies the default style from the user settings to the highlight.
void setWidth(int width)
Set stroke width.
void paint(QPainter *p) override
function to be implemented by derived classes
void updateRect()
recalculates needed rectangle
void setColor(const QColor &color)
Set line/stroke to color, polygon fill to color with alpha = 63.
virtual void setWidth(double width)
Sets the width of the line symbol layer.
virtual double width() const
Returns the estimated width for the line symbol layer.
Qgis::RenderUnit widthUnit() const
Returns the units for the line's width.
An abstract class for items that can be placed on the map canvas.
QgsRectangle rect() const
returns canvas item rectangle in map units
QPointF toCanvasCoordinates(const QgsPointXY &point) const
transformation from map coordinates to screen coordinates
QgsMapCanvas * mMapCanvas
pointer to map canvas
void setRect(const QgsRectangle &r, bool resetRotation=true)
sets canvas item rectangle in map units
bool setRenderContextVariables(QPainter *p, QgsRenderContext &context) const
Sets render context parameters.
Map canvas is a class for displaying all GIS data types on a canvas.
void destinationCrsChanged()
Emitted when map CRS has changed.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
QgsRectangle extent() const
Returns the current zoom extent of the map canvas.
Base class for all map layer types.
virtual QgsMapLayer * clone() const =0
Returns a new instance equivalent to this one except for the id which is still unique.
The QgsMapSettings class contains configuration for rendering of the map.
QgsCoordinateTransform layerTransform(const QgsMapLayer *layer) const
Returns the coordinate transform from layer's CRS to destination CRS.
const QgsMapToPixel & mapToPixel() const
QSize outputSize() const
Returns the size of the resulting map image, in pixels.
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes output image size into account.
Perform transforms between map coordinates and device coordinates.
double mapUnitsPerPixel() const
Returns the current map units per pixel.
QgsPointXY toMapCoordinates(int x, int y) const
Transforms device coordinates to map (world) coordinates.
Represents a map layer supporting display of point clouds.
Abstract base class for 2d point cloud renderers.
A class to represent a 2D point.
Point geometry type, with support for z-dimension and m-values.
A store for object properties.
A rectangle specified with double values.
void setYMinimum(double y)
Set the minimum y value.
void setXMinimum(double x)
Set the minimum x value.
void setYMaximum(double y)
Set the maximum y value.
void setXMaximum(double x)
Set the maximum x value.
bool isFinite() const
Returns true if the rectangle has finite boundaries.
Contains information about the context of a rendering operation.
void setCoordinateTransform(const QgsCoordinateTransform &t)
Sets the current coordinate transform for the context.
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
QPainter * painter()
Returns the destination QPainter for the render operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
void setExtent(const QgsRectangle &extent)
When rendering a map layer, calling this method sets the "clipping" extent for the layer (in the laye...
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
This class is a composition of two QSettings instances:
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
Renders polygons using a single fill and stroke color.
double strokeWidth() const
void setStrokeWidth(double strokeWidth)
Qgis::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
A simple line symbol layer, which renders lines using a line in a variety of styles (e....
Simple marker symbol layer, consisting of a rendered shape with solid fill color and an stroke.
void setStrokeWidth(double w)
Sets the width of the marker's stroke.
Qgis::RenderUnit strokeWidthUnit() const
Returns the unit for the width of the marker's stroke.
double strokeWidth() const
Returns the width of the marker's stroke.
virtual void setStrokeColor(const QColor &color)
Sets the stroke color for the symbol layer.
@ StrokeColor
Stroke color.
virtual void setFillColor(const QColor &color)
Sets the fill color for the symbol layer.
virtual void setDataDefinedProperty(Property key, const QgsProperty &property)
Sets a data defined property for the layer.
virtual void setColor(const QColor &color)
Sets the "representative" color for the symbol layer.
virtual QgsSymbol * subSymbol()
Returns the symbol's sub symbol, if present.
Abstract base class for all rendered symbols.
QgsSymbolLayer * symbolLayer(int layer)
Returns the symbol layer at the specified index.
int symbolLayerCount() const
Returns the total number of symbol layers contained in the symbol.
Represents a vector layer which manages a vector based data sets.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
QVector< QgsPolylineXY > QgsPolygonXY
Polygon: first item of the list is outer ring, inner rings (if any) start from second item.
QVector< QgsPolylineXY > QgsMultiPolylineXY
A collection of QgsPolylines that share a common collection of attributes.
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.
QVector< QgsPolygonXY > QgsMultiPolygonXY
A collection of QgsPolygons that share a common collection of attributes.
#define QgsDebugError(str)
QList< QgsSymbol * > QgsSymbolList