Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgscompoundcurve.h 3 : : --------------------- 4 : : begin : September 2014 5 : : copyright : (C) 2014 by Marco Hugentobler 6 : : email : marco at sourcepole dot ch 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #ifndef QGSCOMPOUNDCURVE_H 19 : : #define QGSCOMPOUNDCURVE_H 20 : : 21 : : #include "qgis_core.h" 22 : : #include "qgis_sip.h" 23 : : #include "qgscurve.h" 24 : : 25 : : /** 26 : : * \ingroup core 27 : : * \class QgsCompoundCurve 28 : : * \brief Compound curve geometry type 29 : : * \since QGIS 2.10 30 : : */ 31 : : class CORE_EXPORT QgsCompoundCurve: public QgsCurve 32 : : { 33 : : public: 34 : : QgsCompoundCurve(); 35 : : QgsCompoundCurve( const QgsCompoundCurve &curve ); 36 : : QgsCompoundCurve &operator=( const QgsCompoundCurve &curve ); 37 : : ~QgsCompoundCurve() override; 38 : : 39 : : bool equals( const QgsCurve &other ) const override; 40 : : 41 : : QString geometryType() const override SIP_HOLDGIL; 42 : : int dimension() const override SIP_HOLDGIL; 43 : : QgsCompoundCurve *clone() const override SIP_FACTORY; 44 : : void clear() override; 45 : : 46 : : bool fromWkb( QgsConstWkbPtr &wkb ) override; 47 : : bool fromWkt( const QString &wkt ) override; 48 : : 49 : : int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override; 50 : : QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override; 51 : : QString asWkt( int precision = 17 ) const override; 52 : : QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override; 53 : : QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override; 54 : : json asJsonObject( int precision = 17 ) const override SIP_SKIP; 55 : : 56 : : //curve interface 57 : : double length() const override SIP_HOLDGIL; 58 : : QgsPoint startPoint() const override SIP_HOLDGIL; 59 : : QgsPoint endPoint() const override SIP_HOLDGIL; 60 : : void points( QgsPointSequence &pts SIP_OUT ) const override; 61 : : int numPoints() const override SIP_HOLDGIL; 62 : : bool isEmpty() const override SIP_HOLDGIL; 63 : : bool isValid( QString &error SIP_OUT, int flags = 0 ) const override; 64 : : 65 : : /** 66 : : * Returns a new line string geometry corresponding to a segmentized approximation 67 : : * of the curve. 68 : : * \param tolerance segmentation tolerance 69 : : * \param toleranceType maximum segmentation angle or maximum difference between approximation and curve 70 : : */ 71 : : QgsLineString *curveToLine( double tolerance = M_PI_2 / 90, SegmentationToleranceType toleranceType = MaximumAngle ) const override SIP_FACTORY; 72 : : 73 : : QgsCompoundCurve *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const override SIP_FACTORY; 74 : : bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false ) override; 75 : : bool boundingBoxIntersects( const QgsRectangle &rectangle ) const override SIP_HOLDGIL; 76 : : 77 : : /** 78 : : * Returns the number of curves in the geometry. 79 : : */ 80 : 13 : int nCurves() const SIP_HOLDGIL { return mCurves.size(); } 81 : : 82 : : /** 83 : : * Returns the curve at the specified index. 84 : : */ 85 : : const QgsCurve *curveAt( int i ) const SIP_HOLDGIL; 86 : : 87 : : /** 88 : : * Adds a curve to the geometry (takes ownership). 89 : : * 90 : : * Since QGIS 3.20, if \a extendPrevious is TRUE, then adding a LineString when the last existing curve 91 : : * in the compound curve is also a LineString will cause the existing linestring to be 92 : : * extended with the newly added LineString vertices instead of appending a whole new 93 : : * LineString curve to the compound curve. This can result in simplified compound curves with lesser number 94 : : * of component curves while still being topologically identical to the desired result. 95 : : */ 96 : : void addCurve( QgsCurve *c SIP_TRANSFER, bool extendPrevious = false ); 97 : : 98 : : /** 99 : : * Removes a curve from the geometry. 100 : : * \param i index of curve to remove 101 : : */ 102 : : void removeCurve( int i ); 103 : : 104 : : /** 105 : : * Adds a vertex to the end of the geometry. 106 : : */ 107 : : void addVertex( const QgsPoint &pt ); 108 : : 109 : : void draw( QPainter &p ) const override; 110 : : void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform, bool transformZ = false ) override SIP_THROW( QgsCsException ); 111 : : void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override; 112 : : void addToPainterPath( QPainterPath &path ) const override; 113 : : void drawAsPolygon( QPainter &p ) const override; 114 : : bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) override; 115 : : bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) override; 116 : : bool deleteVertex( QgsVertexId position ) override; 117 : : double closestSegment( const QgsPoint &pt, QgsPoint &segmentPt SIP_OUT, QgsVertexId &vertexAfter SIP_OUT, int *leftOf SIP_OUT = nullptr, double epsilon = 4 * std::numeric_limits<double>::epsilon() ) const override; 118 : : bool pointAt( int node, QgsPoint &point, QgsVertexId::VertexType &type ) const override; 119 : : void sumUpArea( double &sum SIP_OUT ) const override; 120 : : 121 : : //! Appends first point if not already closed. 122 : : void close(); 123 : : 124 : : bool hasCurvedSegments() const override; 125 : : double vertexAngle( QgsVertexId vertex ) const override; 126 : : double segmentLength( QgsVertexId startVertex ) const override; 127 : : QgsCompoundCurve *reversed() const override SIP_FACTORY; 128 : : QgsPoint *interpolatePoint( double distance ) const override SIP_FACTORY; 129 : : QgsCompoundCurve *curveSubstring( double startDistance, double endDistance ) const override SIP_FACTORY; 130 : : 131 : : bool addZValue( double zValue = 0 ) override; 132 : : bool addMValue( double mValue = 0 ) override; 133 : : 134 : : bool dropZValue() override; 135 : : bool dropMValue() override; 136 : : void swapXy() override; 137 : : 138 : : double xAt( int index ) const override SIP_HOLDGIL; 139 : : double yAt( int index ) const override SIP_HOLDGIL; 140 : : 141 : : bool transform( QgsAbstractGeometryTransformer *transformer, QgsFeedback *feedback = nullptr ) override; 142 : : 143 : : #ifndef SIP_RUN 144 : : void filterVertices( const std::function< bool( const QgsPoint & ) > &filter ) override; 145 : : void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform ) override; 146 : : 147 : : /** 148 : : * Cast the \a geom to a QgsCompoundCurve. 149 : : * Should be used by qgsgeometry_cast<QgsCompoundCurve *>( geometry ). 150 : : * 151 : : * \note Not available in Python. Objects will be automatically be converted to the appropriate target type. 152 : : * \since QGIS 3.0 153 : : */ 154 : 24 : inline static const QgsCompoundCurve *cast( const QgsAbstractGeometry *geom ) 155 : : { 156 : 24 : if ( geom && QgsWkbTypes::flatType( geom->wkbType() ) == QgsWkbTypes::CompoundCurve ) 157 : 23 : return static_cast<const QgsCompoundCurve *>( geom ); 158 : 1 : return nullptr; 159 : 24 : } 160 : : #endif 161 : : 162 : : QgsCompoundCurve *createEmptyWithSameType() const override SIP_FACTORY; 163 : : 164 : : #ifdef SIP_RUN 165 : : SIP_PYOBJECT __repr__(); 166 : : % MethodCode 167 : : QString wkt = sipCpp->asWkt(); 168 : : if ( wkt.length() > 1000 ) 169 : : wkt = wkt.left( 1000 ) + QStringLiteral( "..." ); 170 : : QString str = QStringLiteral( "<QgsCompoundCurve: %1>" ).arg( wkt ); 171 : : sipRes = PyUnicode_FromString( str.toUtf8().constData() ); 172 : : % End 173 : : #endif 174 : : 175 : : protected: 176 : : 177 : : QgsRectangle calculateBoundingBox() const override; 178 : : 179 : : private: 180 : : QVector< QgsCurve * > mCurves; 181 : : 182 : : /** 183 : : * Turns a vertex id for the compound curve into one or more ids for the subcurves 184 : : * \returns the index of the subcurve or -1 in case of error 185 : : */ 186 : : QVector< QPair<int, QgsVertexId> > curveVertexId( QgsVertexId id ) const; 187 : : 188 : : }; 189 : : 190 : : // clazy:excludeall=qstring-allocations 191 : : 192 : : #endif // QGSCOMPOUNDCURVE_H