1 /***************************************************************************
2                         qgsmultisurface.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 QGSMULTISURFACE_H
17 #define QGSMULTISURFACE_H
18 
19 #include "qgis_core.h"
20 #include "qgis_sip.h"
21 #include "qgsgeometrycollection.h"
22 
23 
24 class QgsSurface;
25 
26 /**
27  * \ingroup core
28  * \class QgsMultiSurface
29  * \brief Multi surface geometry collection.
30  * \since QGIS 2.10
31  */
32 class CORE_EXPORT QgsMultiSurface: public QgsGeometryCollection
33 {
34   public:
35 
36     /**
37      * Constructor for an empty multisurface geometry.
38      */
39     QgsMultiSurface() SIP_HOLDGIL;
40 
41 #ifndef SIP_RUN
42 
43     /**
44      * Returns the surface with the specified \a index.
45      *
46      * \since QGIS 3.16
47      */
48     QgsSurface *surfaceN( int index );
49 #else
50 
51     /**
52      * Returns the surface with the specified \a index.
53      *
54      * \throws IndexError if no surface with the specified index exists.
55      *
56      * \since QGIS 3.16
57      */
58     SIP_PYOBJECT surfaceN( int index ) SIP_TYPEHINT( QgsSurface );
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->surfaceN( a0 ), sipType_QgsSurface, NULL );
68     }
69     % End
70 #endif
71 
72 #ifndef SIP_RUN
73 
74     /**
75      * Returns the surface with the specified \a index.
76      *
77      * \note Not available in Python bindings
78      *
79      * \since QGIS 3.16
80      */
81     const QgsSurface *surfaceN( int index ) const;
82 #endif
83 
84     QString geometryType() const override SIP_HOLDGIL;
85     void clear() override;
86     QgsMultiSurface *clone() const override SIP_FACTORY;
87     QgsMultiSurface *toCurveType() const override SIP_FACTORY;
88     bool fromWkt( const QString &wkt ) override;
89     QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
90     QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
91     json asJsonObject( int precision = 17 ) const override SIP_SKIP;
92     bool addGeometry( QgsAbstractGeometry *g SIP_TRANSFER ) override;
93     bool insertGeometry( QgsAbstractGeometry *g SIP_TRANSFER, int index ) override;
94     QgsAbstractGeometry *boundary() const override SIP_FACTORY;
95 
96 #ifndef SIP_RUN
97 
98     /**
99      * Cast the \a geom to a QgsMultiSurface.
100      * Should be used by qgsgeometry_cast<QgsMultiSurface *>( geometry ).
101      *
102      * \note Not available in Python. Objects will be automatically be converted to the appropriate target type.
103      * \since QGIS 3.0
104      */
cast(const QgsAbstractGeometry * geom)105     inline static const QgsMultiSurface *cast( const QgsAbstractGeometry *geom )
106     {
107       if ( !geom )
108         return nullptr;
109 
110       const QgsWkbTypes::Type flatType = QgsWkbTypes::flatType( geom->wkbType() );
111 
112       if ( flatType == QgsWkbTypes::MultiSurface
113            || flatType == QgsWkbTypes::MultiPolygon )
114         return static_cast<const QgsMultiSurface *>( geom );
115       return nullptr;
116     }
117 #endif
118 
119     QgsMultiSurface *createEmptyWithSameType() const override SIP_FACTORY;
120 
121 };
122 
123 // clazy:excludeall=qstring-allocations
124 
125 #endif // QGSMULTISURFACE_H
126