QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
qgslayoutitempolyline.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayoutitempolyline.h
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 #ifndef QGSLAYOUTITEMPOLYLINE_H
18 #define QGSLAYOUTITEMPOLYLINE_H
19 
20 #include "qgis_core.h"
21 #include "qgslayoutitemnodeitem.h"
22 #include "qgssymbol.h"
23 #include <QGraphicsPathItem>
24 #include "qgslogger.h"
25 #include "qgslayout.h"
26 
32 class CORE_EXPORT QgsLayoutItemPolyline: public QgsLayoutNodesItem
33 {
34  Q_OBJECT
35 
36  public:
37 
40  {
44  };
45 
50 
55  QgsLayoutItemPolyline( const QPolygonF &polyline, QgsLayout *layout );
56 
62  static QgsLayoutItemPolyline *create( QgsLayout *layout ) SIP_FACTORY;
63 
64  int type() const override;
65  QIcon icon() const override;
66  QString displayName() const override;
67  QPainterPath shape() const override;
68 
73  QgsLineSymbol *symbol() { return mPolylineStyleSymbol.get(); }
74 
80  void setSymbol( QgsLineSymbol *symbol );
81 
87  MarkerMode startMarker() const { return mStartMarker; }
88 
94  void setStartMarker( MarkerMode mode );
95 
101  MarkerMode endMarker() const { return mEndMarker; }
102 
108  void setEndMarker( MarkerMode mode );
109 
114  void setArrowHeadWidth( double width );
115 
120  double arrowHeadWidth() const { return mArrowHeadWidth; }
121 
127  void setStartSvgMarkerPath( const QString &path );
128 
134  QString startSvgMarkerPath() const { return mStartMarkerFile; }
135 
141  void setEndSvgMarkerPath( const QString &path );
142 
148  QString endSvgMarkerPath() const { return mEndMarkerFile; }
149 
155  QColor arrowHeadStrokeColor() const { return mArrowHeadStrokeColor; }
156 
162  void setArrowHeadStrokeColor( const QColor &color );
163 
169  QColor arrowHeadFillColor() const { return mArrowHeadFillColor; }
170 
176  void setArrowHeadFillColor( const QColor &color );
177 
183  void setArrowHeadStrokeWidth( double width );
184 
190  double arrowHeadStrokeWidth() const { return mArrowHeadStrokeWidth; }
191 
192  bool accept( QgsStyleEntityVisitorInterface *visitor ) const override;
193 
194  protected:
195 
196  bool _addNode( int indexPoint, QPointF newPoint, double radius ) override;
197  bool _removeNode( int nodeIndex ) override;
198  void _draw( QgsLayoutItemRenderContext &context, const QStyleOptionGraphicsItem *itemStyle = nullptr ) override;
199  void _readXmlStyle( const QDomElement &elmt, const QgsReadWriteContext &context ) override;
200  void _writeXmlStyle( QDomDocument &doc, QDomElement &elmt, const QgsReadWriteContext &context ) const override;
201  bool writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const override;
202  bool readPropertiesFromElement( const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context ) override;
203 
204  protected slots:
205 
206  void updateBoundingRect() override;
207 
208  private:
209 
211  std::unique_ptr<QgsLineSymbol> mPolylineStyleSymbol;
212 
214  MarkerMode mStartMarker = NoMarker;
216  MarkerMode mEndMarker = NoMarker;
217 
219  double mArrowHeadWidth = 4.0;
220 
222  double mStartArrowHeadHeight = 0.0;
223 
225  double mEndArrowHeadHeight = 0.0;
226 
228  QString mStartMarkerFile;
229 
231  QString mEndMarkerFile;
232 
234  double mArrowHeadStrokeWidth = 1.0;
235 
236  QColor mArrowHeadStrokeColor = Qt::black;
237  QColor mArrowHeadFillColor = Qt::black;
238 
240  void createDefaultPolylineStyleSymbol();
241 
246  void refreshSymbol();
247 
248  void drawStartMarker( QPainter *painter );
249  void drawEndMarker( QPainter *painter );
250 
251  void drawArrow( QPainter *painter, QPointF center, double angle );
252 
253  void updateMarkerSvgSizes();
254 
264  static void drawArrowHead( QPainter *p, double x, double y, double angle, double arrowHeadWidth );
265  void drawSvgMarker( QPainter *p, QPointF point, double angle, const QString &markerPath, double height ) const;
266 
267  double computeMarkerMargin() const;
268 
269  friend class TestQgsLayoutPolyline;
271 
272 };
273 
274 #endif // QGSLAYOUTITEMPOLYLINE_H
275 
QgsReadWriteContext
The class is used as a container of context for various read/write operations on other objects.
Definition: qgsreadwritecontext.h:35
QgsLayoutNodesItem::readPropertiesFromElement
bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets item state from a DOM element.
Definition: qgslayoutitemnodeitem.cpp:274
QgsLayoutItem::icon
virtual QIcon icon() const
Returns the item's icon.
Definition: qgslayoutitem.h:334
QgsLayoutItemPolyline
Layout item for node based polyline shapes.
Definition: qgslayoutitempolyline.h:33
QgsLayoutItemPolyline::startSvgMarkerPath
QString startSvgMarkerPath() const
Returns the path the an SVG marker drawn at the start of the line.
Definition: qgslayoutitempolyline.h:134
QgsLayoutItemRenderContext
Contains settings and helpers relating to a render of a QgsLayoutItem.
Definition: qgslayoutitem.h:45
QgsLayoutItemPolyline::startMarker
MarkerMode startMarker() const
Returns the start marker mode, which controls what marker is drawn at the start of the line.
Definition: qgslayoutitempolyline.h:87
QgsLayoutNodesItem::_removeNode
virtual bool _removeNode(int nodeIndex)=0
Method called in removeNode.
QgsStyleEntityVisitorInterface
An interface for classes which can visit style entity (e.g.
Definition: qgsstyleentityvisitor.h:34
QgsLayoutItemPolyline::arrowHeadStrokeColor
QColor arrowHeadStrokeColor() const
Returns the color used to draw the stroke around the the arrow head.
Definition: qgslayoutitempolyline.h:155
qgslayoutitemnodeitem.h
SIP_FACTORY
#define SIP_FACTORY
Definition: qgis_sip.h:76
QgsLayoutItem::type
int type() const override
Returns a unique graphics item type identifier.
Definition: qgslayoutitem.cpp:124
QgsLayoutItemPolyline::SvgMarker
@ SvgMarker
Show SVG marker.
Definition: qgslayoutitempolyline.h:43
QgsLayoutItemPolyline::MarkerMode
MarkerMode
Vertex marker mode.
Definition: qgslayoutitempolyline.h:40
QgsLayoutNodesItem::_draw
virtual void _draw(QgsLayoutItemRenderContext &context, const QStyleOptionGraphicsItem *itemStyle=nullptr)=0
Method called in paint.
QgsLayoutItemPolyline::arrowHeadWidth
double arrowHeadWidth() const
Returns the width of line arrow heads in mm.
Definition: qgslayoutitempolyline.h:120
QgsLayoutItemPolyline::endMarker
MarkerMode endMarker() const
Returns the end marker mode, which controls what marker is drawn at the end of the line.
Definition: qgslayoutitempolyline.h:101
QgsCompositionConverter
QgsCompositionConverter class converts a QGIS 2.x composition to a QGIS 3.x layout.
Definition: qgscompositionconverter.h:55
QgsLayoutItem::accept
virtual bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified style entity visitor, causing it to visit all style entities associated with th...
Definition: qgslayoutitem.cpp:1165
QgsLineSymbol
A line symbol type, for rendering LineString and MultiLineString geometries.
Definition: qgssymbol.h:1131
QgsLayoutItemPolyline::arrowHeadStrokeWidth
double arrowHeadStrokeWidth() const
Returns the pen width in millimeters for the stroke of the arrow head.
Definition: qgslayoutitempolyline.h:190
QgsLayoutNodesItem::writePropertiesToElement
bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores item state within an XML DOM element.
Definition: qgslayoutitemnodeitem.cpp:354
QgsLayoutItemPolyline::endSvgMarkerPath
QString endSvgMarkerPath() const
Returns the path the an SVG marker drawn at the end of the line.
Definition: qgslayoutitempolyline.h:148
qgslayout.h
QgsLayoutItemPolyline::ArrowHead
@ ArrowHead
Show arrow marker.
Definition: qgslayoutitempolyline.h:42
QgsLayoutNodesItem::_readXmlStyle
virtual void _readXmlStyle(const QDomElement &elmt, const QgsReadWriteContext &context)=0
Method called in readXml.
QgsLayout
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition: qgslayout.h:50
QgsLayoutNodesItem
An abstract layout item that provides generic methods for node based shapes such as polygon or polyli...
Definition: qgslayoutitemnodeitem.h:30
QgsLayoutItem::displayName
virtual QString displayName() const
Gets item display name.
Definition: qgslayoutitem.cpp:107
QgsLayoutItemPolyline::symbol
QgsLineSymbol * symbol()
Returns the line symbol used to draw the shape.
Definition: qgslayoutitempolyline.h:73
QgsLayoutItemPolyline::NoMarker
@ NoMarker
Don't show marker.
Definition: qgslayoutitempolyline.h:41
QgsLayoutNodesItem::updateBoundingRect
virtual void updateBoundingRect()
Called when the bounding rect of the item should recalculated.
Definition: qgslayoutitemnodeitem.cpp:343
qgslogger.h
QgsLayoutNodesItem::_writeXmlStyle
virtual void _writeXmlStyle(QDomDocument &doc, QDomElement &elmt, const QgsReadWriteContext &context) const =0
Method called in writeXml.
QgsLayoutItemPolyline::arrowHeadFillColor
QColor arrowHeadFillColor() const
Returns the color used to fill the arrow head.
Definition: qgslayoutitempolyline.h:169
MathUtils::angle
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
Definition: MathUtils.cpp:786
QgsLayoutNodesItem::_addNode
virtual bool _addNode(int nodeIndex, QPointF newNode, double radius)=0
Method called in addNode.
qgssymbol.h