37 props.insert( QStringLiteral(
"color" ), QStringLiteral(
"white" ) );
38 props.insert( QStringLiteral(
"style" ), QStringLiteral(
"solid" ) );
39 props.insert( QStringLiteral(
"style_border" ), QStringLiteral(
"solid" ) );
40 props.insert( QStringLiteral(
"color_border" ), QStringLiteral(
"black" ) );
41 props.insert( QStringLiteral(
"width_border" ), QStringLiteral(
"0.3" ) );
42 props.insert( QStringLiteral(
"joinstyle" ), QStringLiteral(
"miter" ) );
59 if ( mHasFixedMapPosition == fixed )
62 mHasFixedMapPosition = fixed;
68 mMapPosition = position;
74 mMapPositionCrs =
crs;
80 mRelativePosition = position;
92 return mOffsetFromReferencePoint / 3.7795275;
97 mOffsetFromReferencePoint = offset;
111 return mFrameSize / 3.7795275;
124 mContentsMargins = margins;
130 mFillSymbol.reset( symbol );
136 return mFillSymbol.get();
141 QPainter *painter = context.
painter();
150 drawFrame( context );
151 if ( mHasFixedMapPosition )
153 drawMarkerSymbol( context );
155 if ( mHasFixedMapPosition )
177 mMarkerSymbol.reset( symbol );
220 return QSizeF( 0, 0 );
228 auto scaleSize = [&context](
double size )->
double
233 const QRectF frameRect( mHasFixedMapPosition ? scaleSize( mOffsetFromReferencePoint.x() ) : 0,
234 mHasFixedMapPosition ? scaleSize( mOffsetFromReferencePoint.y() ) : 0,
235 scaleSize( mFrameSize.width() ),
236 scaleSize( mFrameSize.height() ) );
241 mFillSymbol->startRender( context );
242 const QVector<QPolygonF> rings;
243 mFillSymbol->renderPolygon( poly, &rings,
nullptr, context );
244 mFillSymbol->stopRender( context );
256 mMarkerSymbol->startRender( context );
257 mMarkerSymbol->renderPoint( QPointF( 0, 0 ),
nullptr, context );
258 mMarkerSymbol->stopRender( context );
264 if ( itemElem.isNull() )
268 QDomElement annotationElem = doc.createElement( QStringLiteral(
"AnnotationItem" ) );
269 annotationElem.setAttribute( QStringLiteral(
"mapPositionFixed" ), mHasFixedMapPosition );
270 annotationElem.setAttribute( QStringLiteral(
"mapPosX" ),
qgsDoubleToString( mMapPosition.
x() ) );
271 annotationElem.setAttribute( QStringLiteral(
"mapPosY" ),
qgsDoubleToString( mMapPosition.
y() ) );
272 if ( mMapPositionCrs.
isValid() )
273 mMapPositionCrs.
writeXml( annotationElem, doc );
274 annotationElem.setAttribute( QStringLiteral(
"offsetXMM" ),
qgsDoubleToString( mOffsetFromReferencePoint.x() ) );
275 annotationElem.setAttribute( QStringLiteral(
"offsetYMM" ),
qgsDoubleToString( mOffsetFromReferencePoint.y() ) );
276 annotationElem.setAttribute( QStringLiteral(
"frameWidthMM" ),
qgsDoubleToString( mFrameSize.width() ) );
277 annotationElem.setAttribute( QStringLiteral(
"frameHeightMM" ),
qgsDoubleToString( mFrameSize.height() ) );
278 annotationElem.setAttribute( QStringLiteral(
"canvasPosX" ),
qgsDoubleToString( mRelativePosition.x() ) );
279 annotationElem.setAttribute( QStringLiteral(
"canvasPosY" ),
qgsDoubleToString( mRelativePosition.y() ) );
280 annotationElem.setAttribute( QStringLiteral(
"contentsMargin" ), mContentsMargins.
toString() );
281 annotationElem.setAttribute( QStringLiteral(
"visible" ),
isVisible() );
284 annotationElem.setAttribute( QStringLiteral(
"mapLayer" ), mMapLayer->id() );
289 if ( !symbolElem.isNull() )
291 annotationElem.appendChild( symbolElem );
296 QDomElement fillElem = doc.createElement( QStringLiteral(
"fillSymbol" ) );
298 if ( !symbolElem.isNull() )
300 fillElem.appendChild( symbolElem );
301 annotationElem.appendChild( fillElem );
304 itemElem.appendChild( annotationElem );
309 if ( annotationElem.isNull() )
314 pos.setX( annotationElem.attribute( QStringLiteral(
"canvasPosX" ), QStringLiteral(
"0" ) ).toDouble() );
315 pos.setY( annotationElem.attribute( QStringLiteral(
"canvasPosY" ), QStringLiteral(
"0" ) ).toDouble() );
316 if ( pos.x() >= 1 || pos.x() < 0 || pos.y() < 0 || pos.y() >= 1 )
317 mRelativePosition = QPointF();
319 mRelativePosition = pos;
321 mapPos.
setX( annotationElem.attribute( QStringLiteral(
"mapPosX" ), QStringLiteral(
"0" ) ).toDouble() );
322 mapPos.
setY( annotationElem.attribute( QStringLiteral(
"mapPosY" ), QStringLiteral(
"0" ) ).toDouble() );
323 mMapPosition = mapPos;
325 if ( !mMapPositionCrs.
readXml( annotationElem ) )
330 mContentsMargins =
QgsMargins::fromString( annotationElem.attribute( QStringLiteral(
"contentsMargin" ) ) );
332 if ( annotationElem.hasAttribute( QStringLiteral(
"frameWidthMM" ) ) )
333 mFrameSize.setWidth( annotationElem.attribute( QStringLiteral(
"frameWidthMM" ), QStringLiteral(
"5" ) ).toDouble() );
335 mFrameSize.setWidth( dpiScale * annotationElem.attribute( QStringLiteral(
"frameWidth" ), QStringLiteral(
"50" ) ).toDouble() );
336 if ( annotationElem.hasAttribute( QStringLiteral(
"frameHeightMM" ) ) )
337 mFrameSize.setHeight( annotationElem.attribute( QStringLiteral(
"frameHeightMM" ), QStringLiteral(
"3" ) ).toDouble() );
339 mFrameSize.setHeight( dpiScale * annotationElem.attribute( QStringLiteral(
"frameHeight" ), QStringLiteral(
"50" ) ).toDouble() );
341 if ( annotationElem.hasAttribute( QStringLiteral(
"offsetXMM" ) ) )
342 mOffsetFromReferencePoint.setX( annotationElem.attribute( QStringLiteral(
"offsetXMM" ), QStringLiteral(
"0" ) ).toDouble() );
344 mOffsetFromReferencePoint.setX( dpiScale * annotationElem.attribute( QStringLiteral(
"offsetX" ), QStringLiteral(
"0" ) ).toDouble() );
345 if ( annotationElem.hasAttribute( QStringLiteral(
"offsetYMM" ) ) )
346 mOffsetFromReferencePoint.setY( annotationElem.attribute( QStringLiteral(
"offsetYMM" ), QStringLiteral(
"0" ) ).toDouble() );
348 mOffsetFromReferencePoint.setY( dpiScale * annotationElem.attribute( QStringLiteral(
"offsetY" ), QStringLiteral(
"0" ) ).toDouble() );
350 mHasFixedMapPosition = annotationElem.attribute( QStringLiteral(
"mapPositionFixed" ), QStringLiteral(
"1" ) ).toInt();
351 mVisible = annotationElem.attribute( QStringLiteral(
"visible" ), QStringLiteral(
"1" ) ).toInt();
352 if ( annotationElem.hasAttribute( QStringLiteral(
"mapLayer" ) ) )
359 const QDomElement symbolElem = annotationElem.firstChildElement( QStringLiteral(
"symbol" ) );
360 if ( !symbolElem.isNull() )
362 QgsMarkerSymbol *symbol = QgsSymbolLayerUtils::loadSymbol<QgsMarkerSymbol>( symbolElem, context );
365 mMarkerSymbol.reset( symbol );
370 mFillSymbol.reset(
nullptr );
371 const QDomElement fillElem = annotationElem.firstChildElement( QStringLiteral(
"fillSymbol" ) );
372 if ( !fillElem.isNull() )
374 const QDomElement symbolElem = fillElem.firstChildElement( QStringLiteral(
"symbol" ) );
375 if ( !symbolElem.isNull() )
377 QgsFillSymbol *symbol = QgsSymbolLayerUtils::loadSymbol<QgsFillSymbol>( symbolElem, context );
380 mFillSymbol.reset( symbol );
387 frameColor.setNamedColor( annotationElem.attribute( QStringLiteral(
"frameColor" ), QStringLiteral(
"#000000" ) ) );
388 frameColor.setAlpha( annotationElem.attribute( QStringLiteral(
"frameColorAlpha" ), QStringLiteral(
"255" ) ).toInt() );
389 QColor frameBackgroundColor;
390 frameBackgroundColor.setNamedColor( annotationElem.attribute( QStringLiteral(
"frameBackgroundColor" ) ) );
391 frameBackgroundColor.setAlpha( annotationElem.attribute( QStringLiteral(
"frameBackgroundColorAlpha" ), QStringLiteral(
"255" ) ).toInt() );
392 double frameBorderWidth = annotationElem.attribute( QStringLiteral(
"frameBorderWidth" ), QStringLiteral(
"0.5" ) ).toDouble();
394 frameBorderWidth = frameBorderWidth * 25.4 / 96.0;
396 props.insert( QStringLiteral(
"color" ), frameBackgroundColor.name() );
397 props.insert( QStringLiteral(
"style" ), QStringLiteral(
"solid" ) );
398 props.insert( QStringLiteral(
"style_border" ), QStringLiteral(
"solid" ) );
399 props.insert( QStringLiteral(
"color_border" ), frameColor.name() );
400 props.insert( QStringLiteral(
"width_border" ), QString::number( frameBorderWidth ) );
401 props.insert( QStringLiteral(
"joinstyle" ), QStringLiteral(
"miter" ) );
410 target->mVisible = mVisible;
411 target->mHasFixedMapPosition = mHasFixedMapPosition;
412 target->mMapPosition = mMapPosition;
413 target->mMapPositionCrs = mMapPositionCrs;
414 target->mRelativePosition = mRelativePosition;
415 target->mOffsetFromReferencePoint = mOffsetFromReferencePoint;
416 target->mFrameSize = mFrameSize;
417 target->mMarkerSymbol.reset( mMarkerSymbol ? mMarkerSymbol->clone() : nullptr );
418 target->mContentsMargins = mContentsMargins;
419 target->mFillSymbol.reset( mFillSymbol ? mFillSymbol->clone() : nullptr );
420 target->mSegmentPointWidthMm = mSegmentPointWidthMm;
421 target->mMapLayer = mMapLayer;
422 target->mFeature = mFeature;
@ Millimeters
Millimeters.
Abstract base class for annotation items which are drawn over a map.
void appearanceChanged()
Emitted whenever the annotation's appearance changes.
Q_DECL_DEPRECATED void setFrameSize(QSizeF size)
Sets the size (in pixels) of the annotation's frame (the main area in which the annotation's content ...
void setFillSymbol(QgsFillSymbol *symbol)
Sets the fill symbol used for rendering the annotation frame.
Q_DECL_DEPRECATED void setFrameOffsetFromReferencePoint(QPointF offset)
Sets the annotation's frame's offset (in pixels) from the mapPosition() reference point.
void setRelativePosition(QPointF position)
Sets the relative position of the annotation, if it is not attached to a fixed map position.
virtual void renderAnnotation(QgsRenderContext &context, QSizeF size) const =0
Renders the annotation's contents to a target /a context at the specified /a size.
void setMapPosition(const QgsPointXY &position)
Sets the map position of the annotation, if it is attached to a fixed map position.
void moved()
Emitted when the annotation's position has changed and items need to be moved to reflect this.
Q_DECL_DEPRECATED QPointF frameOffsetFromReferencePoint() const
Returns the annotation's frame's offset (in pixels) from the mapPosition() reference point.
void _writeXml(QDomElement &itemElem, QDomDocument &doc, const QgsReadWriteContext &context) const
Writes common annotation properties to a DOM element.
virtual bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified style entity visitor, causing it to visit all style entities associated within ...
void setContentsMargin(const QgsMargins &margins)
Sets the margins (in millimeters) between the outside of the frame and the annotation content.
void setFrameSizeMm(QSizeF size)
Sets the size (in millimeters) of the annotation's frame (the main area in which the annotation's con...
virtual void setAssociatedFeature(const QgsFeature &feature)
Sets the feature associated with the annotation.
void setFrameOffsetFromReferencePointMm(QPointF offset)
Sets the annotation's frame's offset (in millimeters) from the mapPosition() reference point.
void setMapPositionCrs(const QgsCoordinateReferenceSystem &crs)
Sets the CRS of the map position.
~QgsAnnotation() override
void _readXml(const QDomElement &annotationElem, const QgsReadWriteContext &context)
Reads common annotation properties from a DOM element.
void copyCommonProperties(QgsAnnotation *target) const
Copies common annotation properties to the targe annotation.
void render(QgsRenderContext &context) const
Renders the annotation to a target render context.
virtual QSizeF minimumFrameSize() const
Returns the minimum frame size for the annotation.
bool isVisible() const
Returns true if the annotation is visible and should be rendered.
void setHasFixedMapPosition(bool fixed)
Sets whether the annotation is attached to a fixed map position, or uses a position relative to the c...
QgsAnnotation(QObject *parent=nullptr)
Constructor for QgsAnnotation.
void setMarkerSymbol(QgsMarkerSymbol *symbol)
Sets the symbol that is drawn at the annotation's map position.
QgsFillSymbol * fillSymbol() const
Returns the symbol that is used for rendering the annotation frame.
void setVisible(bool visible)
Sets whether the annotation is visible and should be rendered.
void mapLayerChanged()
Emitted when the map layer associated with the annotation changes.
void setMapLayer(QgsMapLayer *layer)
Sets the map layer associated with the annotation.
This class represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
bool readXml(const QDomNode &node)
Restores state from the given DOM node.
bool writeXml(QDomNode &node, QDomDocument &doc) const
Stores state to the given Dom node in the given document.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
bool isCanceled() const
Tells whether the operation has been canceled already.
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
static QgsFillSymbol * createSimple(const QVariantMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
Base class for all map layer types.
The QgsMargins class defines the four margins of a rectangle.
double top() const
Returns the top margin.
static QgsMargins fromString(const QString &string)
Returns a QgsMargins object decoded from a string, or a null QgsMargins if the string could not be in...
double right() const
Returns the right margin.
double bottom() const
Returns the bottom margin.
QString toString() const
Returns the margins encoded to a string.
double left() const
Returns the left margin.
A marker symbol type, for rendering Point and MultiPoint geometries.
static int qtDefaultDpiX()
Returns the default Qt horizontal DPI.
A class to represent a 2D point.
void setY(double y)
Sets the y value of the point.
void setX(double x)
Sets the x value of the point.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
The class is used as a container of context for various read/write operations on other objects.
Contains information about the context of a rendering operation.
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.
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
QgsFeedback * feedback() const
Returns the feedback object that can be queried regularly during rendering to check if rendering shou...
Scoped object for saving and restoring a QPainter object's state.
static QPolygonF createBalloon(const QgsPointXY &origin, const QRectF &rect, double wedgeWidth)
Generates a "balloon"/"talking bubble" style shape (as a QPolygonF).
An interface for classes which can visit style entity (e.g.
@ Annotation
An individual annotation.
virtual bool visitExit(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor stops visiting a node.
virtual bool visitEnter(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor starts visiting a node.
virtual bool visit(const QgsStyleEntityVisitorInterface::StyleLeaf &entity)
Called when the visitor will visit a style entity.
A symbol entity for QgsStyle databases.
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
const QgsCoordinateReferenceSystem & crs
Contains information relating to a node (i.e.
Contains information relating to the style entity currently being visited.