QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
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 
17 #include "qgslayoutitempolygon.h"
18 #include "qgslayoutitemregistry.h"
19 #include "qgslayoututils.h"
20 #include "qgslayout.h"
21 #include "qgspathresolver.h"
22 #include "qgsreadwritecontext.h"
23 #include "qgssymbollayerutils.h"
24 #include "qgssymbol.h"
25 #include "qgsmapsettings.h"
26 #include "qgsstyleentityvisitor.h"
27 
28 #include <limits>
29 
31  : QgsLayoutNodesItem( layout )
32 {
33  createDefaultPolygonStyleSymbol();
34 }
35 
36 QgsLayoutItemPolygon::QgsLayoutItemPolygon( const QPolygonF &polygon, QgsLayout *layout )
37  : QgsLayoutNodesItem( polygon, layout )
38 {
39  createDefaultPolygonStyleSymbol();
40 }
41 
43 {
44  return new QgsLayoutItemPolygon( layout );
45 }
46 
48 {
50 }
51 
53 {
54  return QgsApplication::getThemeIcon( QStringLiteral( "/mLayoutItemPolygon.svg" ) );
55 }
56 
57 bool QgsLayoutItemPolygon::_addNode( const int indexPoint,
58  QPointF newPoint,
59  const double radius )
60 {
61  Q_UNUSED( radius )
62  mPolygon.insert( indexPoint + 1, newPoint );
63  return true;
64 }
65 
66 void QgsLayoutItemPolygon::createDefaultPolygonStyleSymbol()
67 {
68  QgsStringMap properties;
69  properties.insert( QStringLiteral( "color" ), QStringLiteral( "white" ) );
70  properties.insert( QStringLiteral( "style" ), QStringLiteral( "solid" ) );
71  properties.insert( QStringLiteral( "style_border" ), QStringLiteral( "solid" ) );
72  properties.insert( QStringLiteral( "color_border" ), QStringLiteral( "black" ) );
73  properties.insert( QStringLiteral( "width_border" ), QStringLiteral( "0.3" ) );
74  properties.insert( QStringLiteral( "joinstyle" ), QStringLiteral( "miter" ) );
75 
76  mPolygonStyleSymbol.reset( QgsFillSymbol::createSimple( properties ) );
77 
78  refreshSymbol();
79 }
80 
81 void QgsLayoutItemPolygon::refreshSymbol()
82 {
83  if ( auto *lLayout = layout() )
84  {
85  QgsRenderContext rc = QgsLayoutUtils::createRenderContextForLayout( lLayout, nullptr, lLayout->renderContext().dpi() );
86  mMaxSymbolBleed = ( 25.4 / lLayout->renderContext().dpi() ) * QgsSymbolLayerUtils::estimateMaxSymbolBleed( mPolygonStyleSymbol.get(), rc );
87  }
88 
90 
91  emit frameChanged();
92 }
93 
95 {
96  if ( !id().isEmpty() )
97  return id();
98 
99  return tr( "<Polygon>" );
100 }
101 
103 {
104  if ( mPolygonStyleSymbol )
105  {
106  QgsStyleSymbolEntity entity( mPolygonStyleSymbol.get() );
107  if ( !visitor->visit( QgsStyleEntityVisitorInterface::StyleLeaf( &entity, uuid(), displayName() ) ) )
108  return false;
109  }
110 
111  return true;
112 }
113 
114 QgsLayoutItem::Flags QgsLayoutItemPolygon::itemFlags() const
115 {
116  QgsLayoutItem::Flags flags = QgsLayoutNodesItem::itemFlags();
118  return flags;
119 }
120 
122 {
123  QPolygonF path = mapToScene( mPolygon );
124  // ensure polygon is closed
125  if ( path.at( 0 ) != path.constLast() )
126  path << path.at( 0 );
127  return QgsGeometry::fromQPolygonF( path );
128 }
129 
130 void QgsLayoutItemPolygon::_draw( QgsLayoutItemRenderContext &context, const QStyleOptionGraphicsItem * )
131 {
132  //setup painter scaling to dots so that raster symbology is drawn to scale
134  QTransform t = QTransform::fromScale( scale, scale );
135 
136  QVector<QPolygonF> rings; //empty
137  QPainterPath polygonPath;
138  polygonPath.addPolygon( mPolygon );
139 
140  mPolygonStyleSymbol->startRender( context.renderContext() );
141  mPolygonStyleSymbol->renderPolygon( polygonPath.toFillPolygon( t ), &rings,
142  nullptr, context.renderContext() );
143  mPolygonStyleSymbol->stopRender( context.renderContext() );
144 }
145 
146 void QgsLayoutItemPolygon::_readXmlStyle( const QDomElement &elmt, const QgsReadWriteContext &context )
147 {
148  mPolygonStyleSymbol.reset( QgsSymbolLayerUtils::loadSymbol<QgsFillSymbol>( elmt, context ) );
149 }
150 
152 {
153  mPolygonStyleSymbol.reset( static_cast<QgsFillSymbol *>( symbol->clone() ) );
154  refreshSymbol();
155 }
156 
157 void QgsLayoutItemPolygon::_writeXmlStyle( QDomDocument &doc, QDomElement &elmt, const QgsReadWriteContext &context ) const
158 {
159  const QDomElement pe = QgsSymbolLayerUtils::saveSymbol( QString(),
160  mPolygonStyleSymbol.get(),
161  doc,
162  context );
163  elmt.appendChild( pe );
164 }
165 
166 bool QgsLayoutItemPolygon::_removeNode( const int index )
167 {
168  if ( index < 0 || index >= mPolygon.size() )
169  return false;
170 
171  mPolygon.remove( index );
172 
173  if ( mPolygon.size() < 3 )
174  mPolygon.clear();
175  else
176  {
177  int newSelectNode = index;
178  if ( index == mPolygon.size() )
179  newSelectNode = 0;
180  setSelectedNode( newSelectNode );
181  }
182 
183  return true;
184 }
QgsLayoutItemRegistry::LayoutPolygon
@ LayoutPolygon
Polygon shape item.
Definition: qgslayoutitemregistry.h:322
QgsLayoutItem::id
QString id() const
Returns the item's ID name.
Definition: qgslayoutitem.h:357
QgsLayoutObject::layout
const QgsLayout * layout() const
Returns the layout the object is attached to.
Definition: qgslayoutobject.cpp:126
QgsLayoutItemPolygon::setSymbol
void setSymbol(QgsFillSymbol *symbol)
Sets the symbol used to draw the shape.
Definition: qgslayoutitempolygon.cpp:151
qgslayoutitempolygon.h
QgsRenderContext::convertToPainterUnits
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
Definition: qgsrendercontext.cpp:318
QgsLayoutNodesItem::mMaxSymbolBleed
double mMaxSymbolBleed
Max symbol bleed.
Definition: qgslayoutitemnodeitem.h:138
QgsApplication::getThemeIcon
static QIcon getThemeIcon(const QString &name)
Helper to get a theme icon.
Definition: qgsapplication.cpp:626
QgsReadWriteContext
The class is used as a container of context for various read/write operations on other objects.
Definition: qgsreadwritecontext.h:35
QgsLayoutItemPolygon::symbol
QgsFillSymbol * symbol()
Returns the fill symbol used to draw the shape.
Definition: qgslayoutitempolygon.h:64
QgsStyleSymbolEntity
A symbol entity for QgsStyle databases.
Definition: qgsstyle.h:1201
QgsLayoutItemPolygon::_readXmlStyle
void _readXmlStyle(const QDomElement &elmt, const QgsReadWriteContext &context) override
Method called in readXml.
Definition: qgslayoutitempolygon.cpp:146
qgsreadwritecontext.h
qgssymbollayerutils.h
QgsLayoutItemRenderContext
Contains settings and helpers relating to a render of a QgsLayoutItem.
Definition: qgslayoutitem.h:45
qgspathresolver.h
QgsRenderContext
Contains information about the context of a rendering operation.
Definition: qgsrendercontext.h:58
QgsStyleEntityVisitorInterface
An interface for classes which can visit style entity (e.g.
Definition: qgsstyleentityvisitor.h:34
QgsUnitTypes::RenderMillimeters
@ RenderMillimeters
Millimeters.
Definition: qgsunittypes.h:168
QgsLayoutNodesItem::setSelectedNode
bool setSelectedNode(int index)
Selects a node by index.
Definition: qgslayoutitemnodeitem.cpp:317
qgsmapsettings.h
QgsStyleEntityVisitorInterface::StyleLeaf
Contains information relating to the style entity currently being visited.
Definition: qgsstyleentityvisitor.h:61
QgsLayoutNodesItem::updateSceneRect
void updateSceneRect()
Update the current scene rectangle for this item.
Definition: qgslayoutitemnodeitem.cpp:330
QgsLayoutItem::FlagProvidesClipPath
@ FlagProvidesClipPath
Item can act as a clipping path provider (see clipPath())
Definition: qgslayoutitem.h:304
QgsLayoutNodesItem::mPolygon
QPolygonF mPolygon
Shape's nodes.
Definition: qgslayoutitemnodeitem.h:135
qgslayoututils.h
QgsLayoutItemPolygon::QgsLayoutItemPolygon
QgsLayoutItemPolygon(QgsLayout *layout)
Constructor for QgsLayoutItemPolygon for the specified layout.
Definition: qgslayoutitempolygon.cpp:30
QgsLayoutUtils::createRenderContextForLayout
static QgsRenderContext createRenderContextForLayout(QgsLayout *layout, QPainter *painter, double dpi=-1)
Creates a render context suitable for the specified layout and painter destination.
Definition: qgslayoututils.cpp:138
QgsLayoutItemPolygon::clipPath
QgsGeometry clipPath() const override
Returns the clipping path generated by this item, in layout coordinates.
Definition: qgslayoutitempolygon.cpp:121
QgsLayoutItemPolygon::displayName
QString displayName() const override
Gets item display name.
Definition: qgslayoutitempolygon.cpp:94
QgsLayoutItem::frameChanged
void frameChanged()
Emitted if the item's frame style changes.
QgsLayoutItemPolygon::_writeXmlStyle
void _writeXmlStyle(QDomDocument &doc, QDomElement &elmt, const QgsReadWriteContext &context) const override
Method called in writeXml.
Definition: qgslayoutitempolygon.cpp:157
qgslayout.h
QgsLayoutItemPolygon::itemFlags
QgsLayoutItem::Flags itemFlags() const override
Returns the item's flags, which indicate how the item behaves.
Definition: qgslayoutitempolygon.cpp:114
QgsLayoutItem::itemFlags
virtual Flags itemFlags() const
Returns the item's flags, which indicate how the item behaves.
Definition: qgslayoutitem.cpp:129
QgsLayoutItemRenderContext::renderContext
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
Definition: qgslayoutitem.h:72
QgsLayoutItem::uuid
virtual QString uuid() const
Returns the item identification string.
Definition: qgslayoutitem.h:343
QgsLayoutItemPolygon::_removeNode
bool _removeNode(int nodeIndex) override
Method called in removeNode.
Definition: qgslayoutitempolygon.cpp:166
QgsStringMap
QMap< QString, QString > QgsStringMap
Definition: qgis.h:758
QgsLayoutItemPolygon::_draw
void _draw(QgsLayoutItemRenderContext &context, const QStyleOptionGraphicsItem *itemStyle=nullptr) override
Method called in paint.
Definition: qgslayoutitempolygon.cpp:130
QgsGeometry
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:124
QgsLayout
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition: qgslayout.h:50
QgsLayoutItemPolygon::_addNode
bool _addNode(int indexPoint, QPointF newPoint, double radius) override
Method called in addNode.
Definition: qgslayoutitempolygon.cpp:57
QgsLayoutNodesItem
An abstract layout item that provides generic methods for node based shapes such as polygon or polyli...
Definition: qgslayoutitemnodeitem.h:30
QgsFillSymbol::clone
QgsFillSymbol * clone() const override
Returns a deep copy of this symbol.
Definition: qgssymbol.cpp:2317
QgsFillSymbol
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
Definition: qgssymbol.h:1234
QgsLayoutItemPolygon::accept
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified style entity visitor, causing it to visit all style entities associated with th...
Definition: qgslayoutitempolygon.cpp:102
QgsStyleEntityVisitorInterface::visit
virtual bool visit(const QgsStyleEntityVisitorInterface::StyleLeaf &entity)
Called when the visitor will visit a style entity.
Definition: qgsstyleentityvisitor.h:153
QgsLayoutItemPolygon
Layout item for node based polygon shapes.
Definition: qgslayoutitempolygon.h:30
QgsLayoutItemPolygon::create
static QgsLayoutItemPolygon * create(QgsLayout *layout)
Returns a new polygon item for the specified layout.
Definition: qgslayoutitempolygon.cpp:42
QgsGeometry::fromQPolygonF
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
Definition: qgsgeometry.cpp:3072
QgsFillSymbol::createSimple
static QgsFillSymbol * createSimple(const QgsStringMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
Definition: qgssymbol.cpp:1481
QgsSymbolLayerUtils::estimateMaxSymbolBleed
static double estimateMaxSymbolBleed(QgsSymbol *symbol, const QgsRenderContext &context)
Returns the maximum estimated bleed for the symbol.
Definition: qgssymbollayerutils.cpp:822
qgslayoutitemregistry.h
qgssymbol.h
QgsSymbolLayerUtils::saveSymbol
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
Definition: qgssymbollayerutils.cpp:1182
QgsLayoutItemPolygon::icon
QIcon icon() const override
Returns the item's icon.
Definition: qgslayoutitempolygon.cpp:52
qgsstyleentityvisitor.h
QgsLayoutItemPolygon::type
int type() const override
Definition: qgslayoutitempolygon.cpp:47