1 /***************************************************************************
2                         qgsmultilinestring.h
3   -------------------------------------------------------------------
4 Date                 : 28 Oct 2014
5 Copyright            : (C) 2014 by Marco Hugentobler
6 email                : marco.hugentobler at sourcepole dot com
7  ***************************************************************************
8  *                                                                         *
9  *   This program is free software; you can redistribute it and/or modify  *
10  *   it under the terms of the GNU General Public License as published by  *
11  *   the Free Software Foundation; either version 2 of the License, or     *
12  *   (at your option) any later version.                                   *
13  *                                                                         *
14  ***************************************************************************/
15 
16 #ifndef QGSMULTILINESTRING_H
17 #define QGSMULTILINESTRING_H
18 
19 #include "qgis_core.h"
20 #include "qgis_sip.h"
21 #include "qgsmulticurve.h"
22 
23 class QgsLineString;
24 
25 /**
26  * \ingroup core
27  * \class QgsMultiLineString
28  * \brief Multi line string geometry collection.
29  * \since QGIS 2.10
30  */
31 class CORE_EXPORT QgsMultiLineString: public QgsMultiCurve
32 {
33   public:
34 
35     /**
36      * Constructor for an empty multilinestring geometry.
37      */
38     QgsMultiLineString() SIP_HOLDGIL;
39 
40 
41 #ifndef SIP_RUN
42 
43     /**
44      * Returns the line string with the specified \a index.
45      *
46      * \since QGIS 3.16
47      */
48     QgsLineString *lineStringN( int index );
49 #else
50 
51     /**
52      * Returns the line string with the specified \a index.
53      *
54      * \throws IndexError if no line string with the specified index exists.
55      *
56      * \since QGIS 3.16
57      */
58     SIP_PYOBJECT lineStringN( int index ) SIP_TYPEHINT( QgsLineString );
59     % MethodCode
60     if ( a0 < 0 || a0 >= sipCpp->numGeometries() )
61     {
62       PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
63       sipIsErr = 1;
64     }
65     else
66     {
67       return sipConvertFromType( sipCpp->lineStringN( a0 ), sipType_QgsLineString, NULL );
68     }
69     % End
70 #endif
71 
72 #ifndef SIP_RUN
73 
74     /**
75      * Returns the line string with the specified \a index.
76      *
77      * \note Not available in Python bindings
78      *
79      * \since QGIS 3.16
80      */
81     const QgsLineString *lineStringN( int index ) const;
82 #endif
83 
84     QString geometryType() const override SIP_HOLDGIL;
85     QgsMultiLineString *clone() const override SIP_FACTORY;
86     void clear() override;
87     bool fromWkt( const QString &wkt ) override;
88     QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
89     QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
90     json asJsonObject( int precision = 17 ) const override SIP_SKIP;
91     bool addGeometry( QgsAbstractGeometry *g SIP_TRANSFER ) override;
92     bool insertGeometry( QgsAbstractGeometry *g SIP_TRANSFER, int index ) override;
93 
94     /**
95      * Returns the geometry converted to the more generic curve type QgsMultiCurve
96      * \returns the converted geometry. Caller takes ownership
97     */
98     QgsMultiCurve *toCurveType() const override SIP_FACTORY;
99 
100 #ifndef SIP_RUN
101 
102     /**
103      * Cast the \a geom to a QgsMultiLineString.
104      * Should be used by qgsgeometry_cast<QgsMultiLineString *>( geometry ).
105      *
106      * \note Not available in Python. Objects will be automatically be converted to the appropriate target type.
107      * \since QGIS 3.0
108      */
cast(const QgsAbstractGeometry * geom)109     inline static const QgsMultiLineString *cast( const QgsAbstractGeometry *geom )
110     {
111       if ( geom && QgsWkbTypes::flatType( geom->wkbType() ) == QgsWkbTypes::MultiLineString )
112         return static_cast<const QgsMultiLineString *>( geom );
113       return nullptr;
114     }
115 #endif
116 
117     QgsMultiLineString *createEmptyWithSameType() const override SIP_FACTORY;
118 
119 #ifdef SIP_RUN
120     SIP_PYOBJECT __repr__();
121     % MethodCode
122     QString wkt = sipCpp->asWkt();
123     if ( wkt.length() > 1000 )
124       wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
125     QString str = QStringLiteral( "<QgsMultiLineString: %1>" ).arg( wkt );
126     sipRes = PyUnicode_FromString( str.toUtf8().constData() );
127     % End
128 #endif
129 
130   protected:
131 
132     bool wktOmitChildType() const override;
133 };
134 
135 // clazy:excludeall=qstring-allocations
136 
137 #endif // QGSMULTILINESTRING_H
138