/
qgscompoundcurve.h
163 lines (132 loc) · 6.45 KB
/
qgscompoundcurve.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/***************************************************************************
qgscompoundcurve.h
---------------------
begin : September 2014
copyright : (C) 2014 by Marco Hugentobler
email : marco at sourcepole dot ch
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSCOMPOUNDCURVEV2_H
#define QGSCOMPOUNDCURVEV2_H
#include "qgis_core.h"
#include "qgis.h"
#include "qgscurve.h"
/**
* \ingroup core
* \class QgsCompoundCurve
* \brief Compound curve geometry type
* \since QGIS 2.10
*/
class CORE_EXPORT QgsCompoundCurve: public QgsCurve
{
public:
QgsCompoundCurve();
QgsCompoundCurve( const QgsCompoundCurve &curve );
QgsCompoundCurve &operator=( const QgsCompoundCurve &curve );
~QgsCompoundCurve() override;
bool equals( const QgsCurve &other ) const override;
QString geometryType() const override;
int dimension() const override;
QgsCompoundCurve *clone() const override SIP_FACTORY;
void clear() override;
bool fromWkb( QgsConstWkbPtr &wkb ) override;
bool fromWkt( const QString &wkt ) override;
QByteArray asWkb() const override;
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", const QgsAbstractGeometry::AxisOrder &axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", const QgsAbstractGeometry::AxisOrder &axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QString asJson( int precision = 17 ) const override;
//curve interface
double length() const override;
QgsPoint startPoint() const override;
QgsPoint endPoint() const override;
void points( QgsPointSequence &pts SIP_OUT ) const override;
int numPoints() const override;
bool isEmpty() const override;
/**
* Returns a new line string geometry corresponding to a segmentized approximation
* of the curve.
* \param tolerance segmentation tolerance
* \param toleranceType maximum segmentation angle or maximum difference between approximation and curve*/
QgsLineString *curveToLine( double tolerance = M_PI_2 / 90, SegmentationToleranceType toleranceType = MaximumAngle ) const override SIP_FACTORY;
QgsCompoundCurve *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const override SIP_FACTORY;
bool removeDuplicateNodes( double epsilon = 4 * DBL_EPSILON, bool useZValues = false ) override;
/**
* Returns the number of curves in the geometry.
*/
int nCurves() const { return mCurves.size(); }
/**
* Returns the curve at the specified index.
*/
const QgsCurve *curveAt( int i ) const;
/**
* Adds a curve to the geometry (takes ownership)
*/
void addCurve( QgsCurve *c SIP_TRANSFER );
/**
* Removes a curve from the geometry.
* \param i index of curve to remove
*/
void removeCurve( int i );
/**
* Adds a vertex to the end of the geometry.
*/
void addVertex( const QgsPoint &pt );
void draw( QPainter &p ) const override;
void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
bool transformZ = false ) override;
void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override;
void addToPainterPath( QPainterPath &path ) const override;
void drawAsPolygon( QPainter &p ) const override;
bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) override;
bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) override;
bool deleteVertex( QgsVertexId position ) override;
double closestSegment( const QgsPoint &pt, QgsPoint &segmentPt SIP_OUT, QgsVertexId &vertexAfter SIP_OUT, int *leftOf SIP_OUT = nullptr, double epsilon = 4 * DBL_EPSILON ) const override;
bool pointAt( int node, QgsPoint &point, QgsVertexId::VertexType &type ) const override;
void sumUpArea( double &sum SIP_OUT ) const override;
//! Appends first point if not already closed.
void close();
bool hasCurvedSegments() const override;
double vertexAngle( QgsVertexId vertex ) const override;
double segmentLength( QgsVertexId startVertex ) const override;
QgsCompoundCurve *reversed() const override SIP_FACTORY;
bool addZValue( double zValue = 0 ) override;
bool addMValue( double mValue = 0 ) override;
bool dropZValue() override;
bool dropMValue() override;
double xAt( int index ) const override;
double yAt( int index ) const override;
#ifndef SIP_RUN
/**
* Cast the \a geom to a QgsCompoundCurve.
* Should be used by qgsgeometry_cast<QgsCompoundCurve *>( geometry ).
*
* \note Not available in Python. Objects will be automatically be converted to the appropriate target type.
* \since QGIS 3.0
*/
inline const QgsCompoundCurve *cast( const QgsAbstractGeometry *geom ) const
{
if ( geom && QgsWkbTypes::flatType( geom->wkbType() ) == QgsWkbTypes::CompoundCurve )
return static_cast<const QgsCompoundCurve *>( geom );
return nullptr;
}
#endif
QgsCompoundCurve *createEmptyWithSameType() const override SIP_FACTORY;
protected:
QgsRectangle calculateBoundingBox() const override;
private:
QVector< QgsCurve * > mCurves;
/**
* Turns a vertex id for the compound curve into one or more ids for the subcurves
\returns the index of the subcurve or -1 in case of error*/
QVector< QPair<int, QgsVertexId> > curveVertexId( QgsVertexId id ) const;
};
// clazy:excludeall=qstring-allocations
#endif // QGSCOMPOUNDCURVEV2_H