mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-10-30 00:07:09 -04:00 
			
		
		
		
	The QgsFeature default constructors initialized feature id to 0, which is a valid feature id instead of initializing it fo FID_NULL. This was just wrong and broke the validator for UNIQUE constraints in case a feature with fid 0 existed in the data provider. Fixes #36962
		
			
				
	
	
		
			573 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			573 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /************************************************************************
 | |
|  * This file has been generated automatically from                      *
 | |
|  *                                                                      *
 | |
|  * src/core/qgsfeature.h                                                *
 | |
|  *                                                                      *
 | |
|  * Do not edit manually ! Edit header and run scripts/sipify.pl again   *
 | |
|  ************************************************************************/
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| class QgsFeature
 | |
| {
 | |
| %Docstring
 | |
| The feature class encapsulates a single feature including its id,
 | |
| geometry and a list of field/values attributes.
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    QgsFeature objects are implicitly shared.
 | |
| %End
 | |
| 
 | |
| %TypeHeaderCode
 | |
| #include "qgsfeature.h"
 | |
| #if (SIP_VERSION >= 0x040900 && SIP_VERSION < 0x040c01)
 | |
| #define sipType_QVariant ((sipWrapperType *) sipTypeAsPyTypeObject (sipType_QVariant))
 | |
| #endif
 | |
| %End
 | |
|   public:
 | |
|     static const QMetaObject staticMetaObject;
 | |
| 
 | |
|   public:
 | |
| 
 | |
|     SIP_PYOBJECT __iter__();
 | |
| %MethodCode
 | |
|     QgsAttributes attributes = sipCpp->attributes();
 | |
|     PyObject *attrs = sipConvertFromType( &attributes, sipType_QgsAttributes, Py_None );
 | |
|     sipRes = PyObject_GetIter( attrs );
 | |
| %End
 | |
| 
 | |
|     SIP_PYOBJECT __getitem__( int key );
 | |
| %MethodCode
 | |
|     QgsAttributes attrs = sipCpp->attributes();
 | |
|     if ( a0 < 0 || a0 >= attrs.count() )
 | |
|     {
 | |
|       PyErr_SetString( PyExc_KeyError, QByteArray::number( a0 ) );
 | |
|       sipIsErr = 1;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       QVariant *v = new QVariant( attrs.at( a0 ) );
 | |
|       sipRes = sipConvertFromNewType( v, sipType_QVariant, Py_None );
 | |
|     }
 | |
| %End
 | |
| 
 | |
|     SIP_PYOBJECT __getitem__( const QString &name );
 | |
| %MethodCode
 | |
|     int fieldIdx = sipCpp->fieldNameIndex( *a0 );
 | |
|     if ( fieldIdx == -1 )
 | |
|     {
 | |
|       PyErr_SetString( PyExc_KeyError, a0->toLatin1() );
 | |
|       sipIsErr = 1;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       QVariant *v = new QVariant( sipCpp->attribute( fieldIdx ) );
 | |
|       sipRes = sipConvertFromNewType( v, sipType_QVariant, Py_None );
 | |
|     }
 | |
| %End
 | |
| 
 | |
|     void __setitem__( int key, QVariant value /GetWrapper/ );
 | |
| %MethodCode
 | |
|     bool rv;
 | |
| 
 | |
|     if ( a1Wrapper == Py_None )
 | |
|     {
 | |
|       rv = sipCpp->setAttribute( a0, QVariant( QVariant::Int ) );
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       rv = sipCpp->setAttribute( a0, *a1 );
 | |
|     }
 | |
| 
 | |
|     if ( !rv )
 | |
|     {
 | |
|       PyErr_SetString( PyExc_KeyError, QByteArray::number( a0 ) );
 | |
|       sipIsErr = 1;
 | |
|     }
 | |
| %End
 | |
| 
 | |
|     void __setitem__( const QString &key, QVariant value /GetWrapper/ );
 | |
| %MethodCode
 | |
|     int fieldIdx = sipCpp->fieldNameIndex( *a0 );
 | |
|     if ( fieldIdx == -1 )
 | |
|     {
 | |
|       PyErr_SetString( PyExc_KeyError, a0->toLatin1() );
 | |
|       sipIsErr = 1;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       if ( a1Wrapper == Py_None )
 | |
|       {
 | |
|         sipCpp->setAttribute( *a0, QVariant( QVariant::Int ) );
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         sipCpp->setAttribute( fieldIdx, *a1 );
 | |
|       }
 | |
|     }
 | |
| %End
 | |
| 
 | |
|     void __delitem__( int key );
 | |
| %MethodCode
 | |
|     if ( a0 >= 0 && a0 < sipCpp->attributes().count() )
 | |
|       sipCpp->deleteAttribute( a0 );
 | |
|     else
 | |
|     {
 | |
|       PyErr_SetString( PyExc_KeyError, QByteArray::number( a0 ) );
 | |
|       sipIsErr = 1;
 | |
|     }
 | |
| %End
 | |
| 
 | |
|     void __delitem__( const QString &name );
 | |
| %MethodCode
 | |
|     int fieldIdx = sipCpp->fieldNameIndex( *a0 );
 | |
|     if ( fieldIdx == -1 )
 | |
|     {
 | |
|       PyErr_SetString( PyExc_KeyError, a0->toLatin1() );
 | |
|       sipIsErr = 1;
 | |
|     }
 | |
|     else
 | |
|       sipCpp->deleteAttribute( fieldIdx );
 | |
| %End
 | |
| 
 | |
|     QgsFeature( qint64 id = FID_NULL );
 | |
| %Docstring
 | |
| Constructor for QgsFeature
 | |
| 
 | |
| :param id: feature id
 | |
| %End
 | |
| 
 | |
|     QgsFeature( const QgsFields &fields, qint64 id = FID_NULL );
 | |
| %Docstring
 | |
| Constructor for QgsFeature
 | |
| 
 | |
| :param fields: feature's fields
 | |
| :param id: feature id
 | |
| %End
 | |
| 
 | |
|     QgsFeature( const QgsFeature &rhs );
 | |
| %Docstring
 | |
| Copy constructor
 | |
| %End
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|     virtual ~QgsFeature();
 | |
| 
 | |
|     QgsFeatureId id() const;
 | |
| %Docstring
 | |
| Gets the feature ID for this feature.
 | |
| 
 | |
| :return: feature ID
 | |
| 
 | |
| .. seealso:: :py:func:`setId`
 | |
| %End
 | |
| 
 | |
|     void setId( QgsFeatureId id );
 | |
| %Docstring
 | |
| Sets the feature ID for this feature.
 | |
| 
 | |
| :param id: feature id
 | |
| 
 | |
| .. seealso:: :py:func:`id`
 | |
| %End
 | |
| 
 | |
|     QgsAttributes attributes() const;
 | |
| %Docstring
 | |
| Returns the feature's attributes.
 | |
| 
 | |
| :return: list of feature's attributes
 | |
| 
 | |
| .. seealso:: :py:func:`setAttributes`
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    Alternatively in Python: iterate feature, eg. @code [attr for attr in feature] @endcode
 | |
| 
 | |
| .. versionadded:: 2.9
 | |
| %End
 | |
| 
 | |
|     void setAttributes( const QgsAttributes &attrs );
 | |
| %Docstring
 | |
| Sets the feature's attributes.
 | |
| The feature will be valid after.
 | |
| 
 | |
| :param attrs: attribute list
 | |
| 
 | |
| .. seealso:: :py:func:`setAttribute`
 | |
| 
 | |
| .. seealso:: :py:func:`attributes`
 | |
| %End
 | |
| 
 | |
|     bool setAttribute( int field, const QVariant &attr /GetWrapper/ );
 | |
| %Docstring
 | |
| Set an attribute's value by field index.
 | |
| The feature will be valid if it was successful.
 | |
| 
 | |
| :param field: the index of the field to set
 | |
| :param attr: the value of the attribute
 | |
| 
 | |
| :return: ``False``, if the field index does not exist
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    For Python: raises a KeyError exception instead of returning ``False``
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    Alternatively in Python: @code feature[field] = attr @endcode
 | |
| 
 | |
| .. seealso:: :py:func:`setAttributes`
 | |
| %End
 | |
| %MethodCode
 | |
|     bool rv;
 | |
| 
 | |
|     if ( a1Wrapper == Py_None )
 | |
|     {
 | |
|       rv = sipCpp->setAttribute( a0, QVariant( QVariant::Int ) );
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       rv = sipCpp->setAttribute( a0, *a1 );
 | |
|     }
 | |
| 
 | |
|     if ( !rv )
 | |
|     {
 | |
|       PyErr_SetString( PyExc_KeyError, QByteArray::number( a0 ) );
 | |
|       sipIsErr = 1;
 | |
|     }
 | |
| 
 | |
|     sipRes = rv;
 | |
| %End
 | |
| 
 | |
|     void initAttributes( int fieldCount );
 | |
| %Docstring
 | |
| Initialize this feature with the given number of fields. Discard any previously set attribute data.
 | |
| 
 | |
| :param fieldCount: Number of fields to initialize
 | |
| %End
 | |
| 
 | |
|     void deleteAttribute( int field );
 | |
| %Docstring
 | |
| Deletes an attribute and its value.
 | |
| 
 | |
| :param field: the index of the field
 | |
| 
 | |
| .. seealso:: :py:func:`setAttribute`
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    For Python: raises a KeyError exception if the field is not found
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    Alternatively in Python: @code del feature[field] @endcode
 | |
| %End
 | |
| %MethodCode
 | |
|     if ( a0 >= 0 && a0 < sipCpp->attributes().count() )
 | |
|       sipCpp->deleteAttribute( a0 );
 | |
|     else
 | |
|     {
 | |
|       PyErr_SetString( PyExc_KeyError, QByteArray::number( a0 ) );
 | |
|       sipIsErr = 1;
 | |
|     }
 | |
| %End
 | |
| 
 | |
|     bool isValid() const;
 | |
| %Docstring
 | |
| Returns the validity of this feature. This is normally set by
 | |
| the provider to indicate some problem that makes the feature
 | |
| invalid or to indicate a null feature.
 | |
| 
 | |
| .. seealso:: :py:func:`setValid`
 | |
| %End
 | |
| 
 | |
|     void setValid( bool validity );
 | |
| %Docstring
 | |
| Sets the validity of the feature.
 | |
| 
 | |
| :param validity: set to ``True`` if feature is valid
 | |
| 
 | |
| .. seealso:: :py:func:`isValid`
 | |
| %End
 | |
| 
 | |
|     bool hasGeometry() const;
 | |
| %Docstring
 | |
| Returns ``True`` if the feature has an associated geometry.
 | |
| 
 | |
| .. seealso:: :py:func:`geometry`
 | |
| 
 | |
| .. versionadded:: 3.0.
 | |
| %End
 | |
| 
 | |
|     QgsGeometry geometry() const;
 | |
| %Docstring
 | |
| Returns the geometry associated with this feature. If the feature has no geometry,
 | |
| an empty QgsGeometry object will be returned.
 | |
| 
 | |
| .. seealso:: :py:func:`hasGeometry`
 | |
| 
 | |
| .. seealso:: :py:func:`setGeometry`
 | |
| %End
 | |
| 
 | |
|     void setGeometry( const QgsGeometry &geometry );
 | |
| %Docstring
 | |
| Set the feature's geometry. The feature will be valid after.
 | |
| 
 | |
| :param geometry: new feature geometry
 | |
| 
 | |
| .. seealso:: :py:func:`geometry`
 | |
| 
 | |
| .. seealso:: :py:func:`clearGeometry`
 | |
| %End
 | |
| 
 | |
|     void setGeometry( QgsAbstractGeometry *geometry /Transfer/ );
 | |
| %Docstring
 | |
| Set the feature's ``geometry``. Ownership of the geometry is transferred to the feature.
 | |
| The feature will be made valid after calling this method.
 | |
| 
 | |
| This method is a shortcut for calling:
 | |
| .. code-block:: python
 | |
| 
 | |
|        feature.setGeometry( QgsGeometry( geometry ) )
 | |
| 
 | |
| Example
 | |
| -------
 | |
| 
 | |
| .. code-block:: python
 | |
| 
 | |
|        # Sets a feature's geometry to a point geometry
 | |
|        feature.setGeometry( QgsPoint( 210, 41 ) )
 | |
|        print(feature.geometry())
 | |
|        # output: <QgsGeometry: Point (210 41)>
 | |
| 
 | |
|        # Sets a feature's geometry to a line string
 | |
|        feature.setGeometry( QgsLineString( [ QgsPoint( 210, 41 ), QgsPoint( 301, 55 ) ] ) )
 | |
|        print(feature.geometry())
 | |
|        # output: <QgsGeometry: LineString (210 41, 301 55)>
 | |
| 
 | |
| .. seealso:: :py:func:`geometry`
 | |
| 
 | |
| .. seealso:: :py:func:`clearGeometry`
 | |
| 
 | |
| .. versionadded:: 3.6
 | |
| %End
 | |
| %MethodCode
 | |
|     sipCpp->setGeometry( std::unique_ptr< QgsAbstractGeometry>( a0 ) );
 | |
| %End
 | |
| 
 | |
|     void clearGeometry();
 | |
| %Docstring
 | |
| Removes any geometry associated with the feature.
 | |
| 
 | |
| .. seealso:: :py:func:`setGeometry`
 | |
| 
 | |
| .. seealso:: :py:func:`hasGeometry`
 | |
| 
 | |
| .. versionadded:: 3.0
 | |
| %End
 | |
| 
 | |
|     void setFields( const QgsFields &fields, bool initAttributes = true  );
 | |
| %Docstring
 | |
| Assign a field map with the feature to allow attribute access by attribute name.
 | |
| 
 | |
| :param fields: The attribute fields which this feature holds
 | |
| :param initAttributes: If ``True``, attributes are initialized. Clears any data previously assigned.
 | |
|                        C++: Defaults to ``False``
 | |
|                        Python: Defaults to ``True``
 | |
| 
 | |
| .. seealso:: :py:func:`fields`
 | |
| 
 | |
| .. versionadded:: 2.9
 | |
| %End
 | |
| 
 | |
|     QgsFields fields() const;
 | |
| %Docstring
 | |
| Returns the field map associated with the feature.
 | |
| 
 | |
| .. seealso:: :py:func:`setFields`
 | |
| %End
 | |
| 
 | |
|     void setAttribute( const QString &name, const QVariant &value /GetWrapper/ );
 | |
| %Docstring
 | |
| Insert a value into attribute. Returns ``False`` if attribute name could not be converted to index.
 | |
| Field map must be associated using :py:func:`~QgsFeature.setFields` before this method can be used.
 | |
| The feature will be valid if it was successful
 | |
| 
 | |
| :param name: The name of the field to set
 | |
| :param value: The value to set
 | |
| 
 | |
| :return: ``False`` if attribute name could not be converted to index (C++ only)
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    For Python: raises a KeyError exception instead of returning ``False``
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    Alternatively in Python: @code feature[name] = attr @endcode
 | |
| 
 | |
| .. seealso:: :py:func:`setFields`
 | |
| %End
 | |
| %MethodCode
 | |
|     int fieldIdx = sipCpp->fieldNameIndex( *a0 );
 | |
|     if ( fieldIdx == -1 )
 | |
|     {
 | |
|       PyErr_SetString( PyExc_KeyError, a0->toLatin1() );
 | |
|       sipIsErr = 1;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       if ( a1Wrapper == Py_None )
 | |
|       {
 | |
|         sipCpp->setAttribute( *a0, QVariant( QVariant::Int ) );
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         sipCpp->setAttribute( fieldIdx, *a1 );
 | |
|       }
 | |
|     }
 | |
| %End
 | |
| 
 | |
|     bool deleteAttribute( const QString &name );
 | |
| %Docstring
 | |
| Removes an attribute value by field name. Field map must be associated using :py:func:`~QgsFeature.setFields`
 | |
| before this method can be used.
 | |
| 
 | |
| :param name: The name of the field to delete
 | |
| 
 | |
| :return: ``False`` if attribute name could not be converted to index (C++ only)
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    For Python: raises a KeyError exception instead of returning ``False``
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    Alternatively in Python: @code del feature[name] @endcode
 | |
| 
 | |
| .. seealso:: :py:func:`setFields`
 | |
| %End
 | |
| %MethodCode
 | |
|     int fieldIdx = sipCpp->fieldNameIndex( *a0 );
 | |
|     if ( fieldIdx == -1 )
 | |
|     {
 | |
|       PyErr_SetString( PyExc_KeyError, a0->toLatin1() );
 | |
|       sipIsErr = 1;
 | |
|       sipRes = false;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       sipCpp->deleteAttribute( fieldIdx );
 | |
|       sipRes = true;
 | |
|     }
 | |
| %End
 | |
| 
 | |
|     SIP_PYOBJECT attribute( const QString &name ) const;
 | |
| %Docstring
 | |
| Lookup attribute value from attribute name. Field map must be associated using :py:func:`~QgsFeature.setFields`
 | |
| before this method can be used.
 | |
| 
 | |
| :param name: The name of the attribute to get
 | |
| 
 | |
| :return: The value of the attribute (C++: Invalid variant if no such name exists )
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    For Python: raises a KeyError exception if the field is not found
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    Alternatively in Python: @code feature[name] @endcode
 | |
| 
 | |
| .. seealso:: :py:func:`setFields`
 | |
| %End
 | |
| %MethodCode
 | |
|     int fieldIdx = sipCpp->fieldNameIndex( *a0 );
 | |
|     if ( fieldIdx == -1 )
 | |
|     {
 | |
|       PyErr_SetString( PyExc_KeyError, a0->toLatin1() );
 | |
|       sipIsErr = 1;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       QVariant *v = new QVariant( sipCpp->attribute( fieldIdx ) );
 | |
|       sipRes = sipConvertFromNewType( v, sipType_QVariant, Py_None );
 | |
|     }
 | |
| %End
 | |
| 
 | |
|     SIP_PYOBJECT attribute( int fieldIdx ) const;
 | |
| %Docstring
 | |
| Lookup attribute value from its index. Field map must be associated using :py:func:`~QgsFeature.setFields`
 | |
| before this method can be used.
 | |
| 
 | |
| :param fieldIdx: The index of the attribute to get
 | |
| 
 | |
| :return: The value of the attribute (C++: Invalid variant if no such index exists )
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    For Python: raises a KeyError exception if the field is not found
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|    Alternatively in Python: @code feature[fieldIdx] @endcode
 | |
| 
 | |
| .. seealso:: :py:func:`setFields`
 | |
| %End
 | |
| %MethodCode
 | |
|     {
 | |
|       if ( a0 < 0 || a0 >= sipCpp->attributes().count() )
 | |
|       {
 | |
|         PyErr_SetString( PyExc_KeyError, QByteArray::number( a0 ) );
 | |
|         sipIsErr = 1;
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         QVariant *v = new QVariant( sipCpp->attribute( a0 ) );
 | |
|         sipRes = sipConvertFromNewType( v, sipType_QVariant, Py_None );
 | |
|       }
 | |
|     }
 | |
| %End
 | |
| 
 | |
|     int fieldNameIndex( const QString &fieldName ) const;
 | |
| %Docstring
 | |
| Utility method to get attribute index from name. Field map must be associated using :py:func:`~QgsFeature.setFields`
 | |
| before this method can be used.
 | |
| 
 | |
| :param fieldName: name of field to get attribute index of
 | |
| 
 | |
| :return: -1 if field does not exist or field map is not associated.
 | |
| 
 | |
| .. seealso:: :py:func:`setFields`
 | |
| %End
 | |
| 
 | |
|     operator QVariant() const;
 | |
| 
 | |
| }; // class QgsFeature
 | |
| 
 | |
| 
 | |
| typedef QMap<qint64, QMap<int, QVariant> > QgsChangedAttributesMap;
 | |
| 
 | |
| 
 | |
| typedef QMap<qint64, QgsGeometry> QgsGeometryMap;
 | |
| 
 | |
| typedef QList<QgsFeature> QgsFeatureList;
 | |
| 
 | |
| 
 | |
| 
 | |
| /************************************************************************
 | |
|  * This file has been generated automatically from                      *
 | |
|  *                                                                      *
 | |
|  * src/core/qgsfeature.h                                                *
 | |
|  *                                                                      *
 | |
|  * Do not edit manually ! Edit header and run scripts/sipify.pl again   *
 | |
|  ************************************************************************/
 |