QGIS API Documentation 3.99.0-Master (26c88405ac0)
Loading...
Searching...
No Matches
qgslayoutitempolygon.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgslayoutitempolygon.cpp
3 begin : March 2016
4 copyright : (C) 2016 Paul Blottiere, Oslandia
5 email : paul dot blottiere at oslandia dot com
6 ***************************************************************************/
7
8/***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
18
19#include <limits>
20
21#include "qgsfillsymbol.h"
22#include "qgslayout.h"
25#include "qgslayoututils.h"
26#include "qgsreadwritecontext.h"
28#include "qgssymbol.h"
29#include "qgssymbollayerutils.h"
30
31#include "moc_qgslayoutitempolygon.cpp"
32
35{
36 createDefaultPolygonStyleSymbol();
37}
38
40 : QgsLayoutNodesItem( polygon, layout )
41{
42 createDefaultPolygonStyleSymbol();
43}
44
46
51
56
58{
59 return QgsApplication::getThemeIcon( QStringLiteral( "/mLayoutItemPolygon.svg" ) );
60}
61
62bool QgsLayoutItemPolygon::_addNode( const int indexPoint,
63 QPointF newPoint,
64 const double radius )
65{
66 Q_UNUSED( radius )
67 mPolygon.insert( indexPoint + 1, newPoint );
68 return true;
69}
70
71void QgsLayoutItemPolygon::createDefaultPolygonStyleSymbol()
72{
73 QVariantMap properties;
74 properties.insert( QStringLiteral( "color" ), QStringLiteral( "white" ) );
75 properties.insert( QStringLiteral( "style" ), QStringLiteral( "solid" ) );
76 properties.insert( QStringLiteral( "style_border" ), QStringLiteral( "solid" ) );
77 properties.insert( QStringLiteral( "color_border" ), QStringLiteral( "black" ) );
78 properties.insert( QStringLiteral( "width_border" ), QStringLiteral( "0.3" ) );
79 properties.insert( QStringLiteral( "joinstyle" ), QStringLiteral( "miter" ) );
80
81 mPolygonStyleSymbol = QgsFillSymbol::createSimple( properties );
82
83 refreshSymbol();
84}
85
86void QgsLayoutItemPolygon::refreshSymbol()
87{
88 if ( auto *lLayout = layout() )
89 {
90 const QgsRenderContext rc = QgsLayoutUtils::createRenderContextForLayout( lLayout, nullptr, lLayout->renderContext().dpi() );
91 mMaxSymbolBleed = ( 25.4 / lLayout->renderContext().dpi() ) * QgsSymbolLayerUtils::estimateMaxSymbolBleed( mPolygonStyleSymbol.get(), rc );
92 }
93
95
96 emit frameChanged();
97}
98
100{
101 if ( !id().isEmpty() )
102 return id();
103
104 return tr( "<Polygon>" );
105}
106
108{
109 if ( mPolygonStyleSymbol )
110 {
111 QgsStyleSymbolEntity entity( mPolygonStyleSymbol.get() );
112 if ( !visitor->visit( QgsStyleEntityVisitorInterface::StyleLeaf( &entity, uuid(), displayName() ) ) )
113 return false;
114 }
115
116 return true;
117}
118
125
127{
128 QPolygonF path = mapToScene( mPolygon );
129 // ensure polygon is closed
130 if ( path.at( 0 ) != path.constLast() )
131 path << path.at( 0 );
132 return QgsGeometry::fromQPolygonF( path );
133}
134
135
137{
138 // A Polygon is valid if it has at least 3 unique points
139 QList<QPointF> uniquePoints;
140 int seen = 0;
141 for ( QPointF point : mPolygon )
142 {
143 if ( !uniquePoints.contains( point ) )
144 {
145 uniquePoints.append( point );
146 if ( ++seen > 2 )
147 return true;
148 }
149 }
150 return false;
151}
152
154{
155 return mPolygonStyleSymbol.get();
156}
157
158void QgsLayoutItemPolygon::_draw( QgsLayoutItemRenderContext &context, const QStyleOptionGraphicsItem * )
159{
160 QgsRenderContext renderContext = context.renderContext();
161 // symbol clipping messes with geometry generators used in the symbol for this item, and has no
162 // valid use here. See https://github.com/qgis/QGIS/issues/58909
164
165 //setup painter scaling to dots so that raster symbology is drawn to scale
166 const double scale = renderContext.convertToPainterUnits( 1, Qgis::RenderUnit::Millimeters );
167 const QTransform t = QTransform::fromScale( scale, scale );
168
169 const QVector<QPolygonF> rings; //empty
170 QPainterPath polygonPath;
171 polygonPath.addPolygon( mPolygon );
172
173 mPolygonStyleSymbol->startRender( renderContext );
174 mPolygonStyleSymbol->renderPolygon( polygonPath.toFillPolygon( t ), &rings,
175 nullptr, renderContext );
176 mPolygonStyleSymbol->stopRender( renderContext );
177}
178
179void QgsLayoutItemPolygon::_readXmlStyle( const QDomElement &elmt, const QgsReadWriteContext &context )
180{
181 mPolygonStyleSymbol = QgsSymbolLayerUtils::loadSymbol<QgsFillSymbol>( elmt, context );
182}
183
185{
186 mPolygonStyleSymbol.reset( static_cast<QgsFillSymbol *>( symbol->clone() ) );
187 refreshSymbol();
188}
189
190void QgsLayoutItemPolygon::_writeXmlStyle( QDomDocument &doc, QDomElement &elmt, const QgsReadWriteContext &context ) const
191{
192 const QDomElement pe = QgsSymbolLayerUtils::saveSymbol( QString(),
193 mPolygonStyleSymbol.get(),
194 doc,
195 context );
196 elmt.appendChild( pe );
197}
198
200{
201 if ( index < 0 || index >= mPolygon.size() || mPolygon.size() <= 3 )
202 return false;
203
204 mPolygon.remove( index );
205
206 int newSelectNode = index;
207 if ( index == mPolygon.size() )
208 newSelectNode = 0;
209 setSelectedNode( newSelectNode );
210
211 return true;
212}
213
@ Millimeters
Millimeters.
Definition qgis.h:5184
@ DisableSymbolClippingToExtent
Force symbol clipping to map extent to be disabled in all situations. This will result in slower rend...
Definition qgis.h:2770
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
static std::unique_ptr< QgsFillSymbol > createSimple(const QVariantMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
A geometry is the spatial representation of a feature.
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
QIcon icon() const override
Returns the item's icon.
int type() const override
static QgsLayoutItemPolygon * create(QgsLayout *layout)
Returns a new polygon item for the specified layout.
QgsLayoutItemPolygon(QgsLayout *layout)
Constructor for QgsLayoutItemPolygon for the specified layout.
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified style entity visitor, causing it to visit all style entities associated with th...
QgsGeometry clipPath() const override
Returns the clipping path generated by this item, in layout coordinates.
void setSymbol(QgsFillSymbol *symbol)
Sets the symbol used to draw the shape.
bool isValid() const override
Must be reimplemented in subclasses.
QgsFillSymbol * symbol()
Returns the fill symbol used to draw the shape.
bool _removeNode(int nodeIndex) override
Method called in removeNode.
void _draw(QgsLayoutItemRenderContext &context, const QStyleOptionGraphicsItem *itemStyle=nullptr) override
Method called in paint.
~QgsLayoutItemPolygon() override
bool _addNode(int indexPoint, QPointF newPoint, double radius) override
Method called in addNode.
void _writeXmlStyle(QDomDocument &doc, QDomElement &elmt, const QgsReadWriteContext &context) const override
Method called in writeXml.
void _readXmlStyle(const QDomElement &elmt, const QgsReadWriteContext &context) override
Method called in readXml.
QgsLayoutItem::Flags itemFlags() const override
Returns the item's flags, which indicate how the item behaves.
QString displayName() const override
Gets item display name.
@ LayoutPolygon
Polygon shape item.
Contains settings and helpers relating to a render of a QgsLayoutItem.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
friend class QgsLayout
@ FlagProvidesClipPath
Item can act as a clipping path provider (see clipPath()).
virtual QString uuid() const
Returns the item identification string.
QString id() const
Returns the item's ID name.
void frameChanged()
Emitted if the item's frame style changes.
QFlags< Flag > Flags
QgsLayoutItem::Flags itemFlags() const override
Returns the item's flags, which indicate how the item behaves.
double mMaxSymbolBleed
Max symbol bleed.
bool setSelectedNode(int index)
Selects a node by index.
void updateSceneRect()
Update the current scene rectangle for this item.
QgsLayoutNodesItem(QgsLayout *layout)
Constructor for QgsLayoutNodesItem, attached to the specified layout.
QPolygonF mPolygon
Shape's nodes.
const QgsLayout * layout() const
Returns the layout the object is attached to.
static QgsRenderContext createRenderContextForLayout(QgsLayout *layout, QPainter *painter, double dpi=-1)
Creates a render context suitable for the specified layout and painter destination.
A container for the context for various read/write operations on 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).
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected).
An interface for classes which can visit style entity (e.g.
virtual bool visit(const QgsStyleEntityVisitorInterface::StyleLeaf &entity)
Called when the visitor will visit a style entity.
A symbol entity for QgsStyle databases.
Definition qgsstyle.h:1397
static std::unique_ptr< QgsSymbol > loadSymbol(const QDomElement &element, const QgsReadWriteContext &context)
Attempts to load a symbol from a DOM element.
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
static double estimateMaxSymbolBleed(QgsSymbol *symbol, const QgsRenderContext &context)
Returns the maximum estimated bleed for the symbol.
Contains information relating to the style entity currently being visited.