70 void QgsHighlight::init()
72 mOriginalGeometry = mGeometry.
isNull() ? mFeature.
geometry() : mGeometry;
76 updateTransformedGeometry();
80 mRenderContext = createRenderContext();
84 void QgsHighlight::updateTransformedGeometry()
92 mGeometry = mOriginalGeometry;
99 QgsDebugMsg( QStringLiteral(
"Could not transform highlight geometry to canvas CRS" ) );
113 QgsDebugMsg( QStringLiteral(
"Could not transform highlight geometry to canvas CRS" ) );
126 mPen.setColor(
color );
129 mBrush.setStyle( Qt::SolidPattern );
136 mBrush.setStyle( Qt::SolidPattern );
139 std::unique_ptr<QgsFeatureRenderer> QgsHighlight::createRenderer(
QgsRenderContext &context,
const QColor &color,
const QColor &fillColor )
141 std::unique_ptr<QgsFeatureRenderer> renderer;
160 void QgsHighlight::setSymbol(
QgsSymbol *symbol,
const QgsRenderContext &context,
const QColor &color,
const QColor &fillColor )
211 width = std::max(
width + 2 * mBuffer * scale, mMinWidth * scale );
218 mPen.setWidth(
width );
232 case QgsHighlight::Square:
234 const double xMax = xMin + 2 * radius;
235 const double yMax = yMin + 2 * radius;
236 QPolygonF r( QVector<QPointF> { QPointF( xMin, yMin ),
237 QPointF( xMax, yMin ),
238 QPointF( xMax, yMax ),
239 QPointF( xMin, yMax ),
240 QPointF( xMin, yMin )
242 context.
painter()->drawPolygon( r );
246 case QgsHighlight::Circle:
248 context.
painter()->drawEllipse( QRectF( xMin, yMin, radius * 2, radius * 2 ) );
254 void QgsHighlight::paintLine( QPainter *p,
QgsPolylineXY line )
256 QPolygonF polygon( line.size() );
258 for (
int i = 0; i < line.size(); i++ )
263 p->drawPolyline( polygon );
266 void QgsHighlight::paintPolygon( QPainter *p,
const QgsPolygonXY &polygon )
272 p->setBrush( mBrush );
274 for (
const auto &sourceRing : polygon )
276 if ( sourceRing.empty() )
280 ring.reserve( sourceRing.size() + 1 );
283 for (
const auto &sourceVertex : sourceRing )
287 if ( ring.isEmpty() || std::abs( ring.back().x() - curVertex.x() ) > 1 || std::abs( ring.back().y() - curVertex.y() ) > 1 )
289 ring.push_back( curVertex );
291 lastVertex = curVertex;
294 ring.push_back( ring.at( 0 ) );
296 path.addPolygon( ring );
317 mRenderContext = createRenderContext();
327 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayer );
336 QColor tmpColor( 255, 0, 0, 255 );
337 QColor tmpFillColor( 0, 255, 0, 255 );
339 std::unique_ptr< QgsFeatureRenderer > renderer = createRenderer( context, tmpColor, tmpFillColor );
344 QImage image = QImage( imageSize.width(), imageSize.height(), QImage::Format_ARGB32 );
346 QPainter imagePainter( &image );
347 imagePainter.setRenderHint( QPainter::Antialiasing,
true );
350 renderer->startRender( context, mFeature.
fields() );
352 renderer->renderFeature( mFeature, context );
353 renderer->stopRender( context );
358 int penRed = mPen.color().red();
359 int penGreen = mPen.color().green();
360 int penBlue = mPen.color().blue();
362 double k = ( 255. - mBrush.color().alpha() ) / 255.;
363 QRgb *line =
nullptr;
364 const int height = image.height();
365 const int width = image.width();
366 for (
int r = 0; r < height; r++ )
368 line =
reinterpret_cast<QRgb *
>( image.scanLine( r ) );
371 int alpha = qAlpha( line[
c] );
374 int green = qGreen( line[
c] );
375 line[
c] = qRgba( penRed, penGreen, penBlue, std::clamp(
static_cast< int >( alpha - ( green * k ) ), 0, 255 ) );
380 p->drawImage( 0, 0, image );
383 else if ( !mGeometry.
isNull() )
386 p->setBrush( mBrush );
388 switch ( mGeometry.
type() )
395 double pointSizeRadius = 1.5;
397 PointSymbol symbol = Square;
404 pointSizeRadius = 1.2 * 0.5 * mRenderContext.
convertToPainterUnits( pcRenderer->pointSize(), pcRenderer->pointSizeUnit(), pcRenderer->pointSizeMapUnitScale() );
406 switch ( pcRenderer->pointSymbol() )
408 case QgsPointCloudRenderer::PointSymbol::Circle:
411 case QgsPointCloudRenderer::PointSymbol::Square:
420 paintPoint( mRenderContext, qgsgeometry_cast< const QgsPoint *>( *it ), pointSizeRadius, sizeUnit, symbol );
435 for (
int i = 0; i < m.size(); i++ )
437 paintLine( p, m[i] );
447 paintPolygon( p, mGeometry.
asPolygon() );
452 for (
int i = 0; i < m.size(); i++ )
454 paintPolygon( p, m[i] );
469 if ( qobject_cast<QgsPointCloudLayer *>( mLayer ) || mFeature.
hasGeometry() )
482 QgsRectangle rect( topLeft.
x(), topLeft.
y(), topLeft.
x() + imageSize.width()*res, topLeft.
y() - imageSize.height()*res );
487 else if ( !mGeometry.
isNull() )
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.
void setGeometry(const QgsGeometry &geometry)
Set the feature's 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) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
QgsPolygonXY asPolygon() const
Returns the contents of the geometry as a polygon.
bool isMultipart() const SIP_HOLDGIL
Returns true if WKB of the geometry is of WKBMulti* type.
QgsPolylineXY asPolyline() const
Returns the contents of the geometry as a polyline.
QgsWkbTypes::GeometryType type
QgsMultiPolylineXY asMultiPolyline() const
Returns the contents of the geometry as a multi-linestring.
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
QgsHighlight(QgsMapCanvas *mapCanvas, const QgsGeometry &geom, QgsMapLayer *layer)
Constructor for QgsHighlight.
QgsMapLayer * layer() const
Returns the layer for which this highlight has been created.
void setFillColor(const QColor &fillColor)
Fill color for 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.
QgsUnitTypes::RenderUnit widthUnit() const
Returns the units for the line's width.
virtual double width() const
Returns the estimated width for the line symbol layer.
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.
QSize outputSize() const
Returns the size of the resulting map image, in pixels.
const QgsMapToPixel & mapToPixel() const
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.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
void setYMinimum(double y) SIP_HOLDGIL
Set the minimum y value.
void setXMaximum(double x) SIP_HOLDGIL
Set the maximum x value.
void setXMinimum(double x) SIP_HOLDGIL
Set the minimum x value.
void setYMaximum(double y) SIP_HOLDGIL
Set the maximum y value.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
bool isEmpty() const
Returns true if the rectangle is empty.
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
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
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
double strokeWidth() const
void setStrokeWidth(double strokeWidth)
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.
QgsUnitTypes::RenderUnit strokeWidthUnit() const
Returns the unit for the width of the marker's stroke.
void setStrokeWidth(double w)
Sets the width of the marker's stroke.
double strokeWidth() const
Returns the width of the marker's stroke.
@ PropertyFillColor
Fill color.
@ PropertyStrokeColor
Stroke color.
virtual void setFillColor(const QColor &color)
Set fill color.
virtual void setStrokeColor(const QColor &color)
Set stroke color.
virtual void setDataDefinedProperty(Property key, const QgsProperty &property)
Sets a data defined property for the layer.
virtual QgsSymbol * subSymbol()
Returns the symbol's sub symbol, if present.
virtual void setColor(const QColor &color)
The fill color.
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.
RenderUnit
Rendering size units.
@ RenderMillimeters
Millimeters.
@ RenderMapUnits
Map units.
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.
QList< QgsSymbol * > QgsSymbolList