Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add method to set QgsFeature geometry directly from QgsAbstractGeometry
Allows

    feat.setGeometry(QgsPoint(1,2))

instead of the more obscure

    feat.setGeometry(QgsGeometry(QgsPoint(1,2)))
  • Loading branch information
nyalldawson committed Nov 20, 2018
1 parent 17e5873 commit e21ea25
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 3 deletions.
16 changes: 15 additions & 1 deletion python/core/auto_generated/qgsfeature.sip.in
Expand Up @@ -13,7 +13,6 @@




class QgsFeature
{
%Docstring
Expand Down Expand Up @@ -329,6 +328,21 @@ Set the feature's geometry. The feature will be valid after.
.. 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.

.. 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.
Expand Down
7 changes: 7 additions & 0 deletions src/core/qgsfeature.cpp
Expand Up @@ -141,6 +141,13 @@ void QgsFeature::setGeometry( const QgsGeometry &geometry )
d->valid = true;
}

void QgsFeature::setGeometry( std::unique_ptr<QgsAbstractGeometry> geometry )
{
d.detach();
d->geometry = QgsGeometry( std::move( geometry ) );
d->valid = true;
}

void QgsFeature::clearGeometry()
{
setGeometry( QgsGeometry() );
Expand Down
19 changes: 18 additions & 1 deletion src/core/qgsfeature.h
Expand Up @@ -30,12 +30,13 @@ email : sherman at mrcc.com
#include "qgsattributes.h"
#include "qgsfields.h"
#include "qgsfeatureid.h"

#include <memory>
class QgsFeature;
class QgsFeaturePrivate;
class QgsField;
class QgsGeometry;
class QgsRectangle;
class QgsAbstractGeometry;


/***************************************************************************
Expand Down Expand Up @@ -345,6 +346,22 @@ class CORE_EXPORT QgsFeature
*/
void setGeometry( const QgsGeometry &geometry );

/**
* Set the feature's \a geometry. Ownership of the geometry is transferred to the feature.
* The feature will be made valid after calling this method.
* \see geometry()
* \see clearGeometry()
* \since QGIS 3.6
*/
#ifndef SIP_RUN
void setGeometry( std::unique_ptr< QgsAbstractGeometry > geometry );
#else
void setGeometry( QgsAbstractGeometry *geometry SIP_TRANSFER );
% MethodCode
sipCpp->setGeometry( std::unique_ptr< QgsAbstractGeometry>( a0 ) );
% End
#endif

/**
* Removes any geometry associated with the feature.
* \see setGeometry()
Expand Down
7 changes: 7 additions & 0 deletions tests/src/core/testqgsfeature.cpp
Expand Up @@ -306,6 +306,13 @@ void TestQgsFeature::geometry()
QCOMPARE( copy.geometry().asWkb(), geomByRef.asWkb() );
QCOMPARE( feature.geometry().asWkb(), mGeometry.asWkb() );

//setGeometry using abstract geom
copy = feature;
QCOMPARE( copy.geometry().asWkb(), mGeometry.asWkb() );
copy.setGeometry( qgis::make_unique< QgsPoint >( 5, 6 ) );
QCOMPARE( copy.geometry().asWkt(), QStringLiteral( "Point (5 6)" ) );
QCOMPARE( feature.geometry().asWkb(), mGeometry.asWkb() );

//clearGeometry
QgsFeature geomFeature;
geomFeature.setGeometry( QgsGeometry( mGeometry2 ) );
Expand Down
13 changes: 12 additions & 1 deletion tests/src/python/test_qgsfeature.py
Expand Up @@ -15,7 +15,14 @@
import qgis # NOQA

import os
from qgis.core import QgsFeature, QgsGeometry, QgsPointXY, QgsVectorLayer, NULL, QgsFields, QgsField
from qgis.core import (QgsFeature,
QgsPoint,
QgsGeometry,
QgsPointXY,
QgsVectorLayer,
NULL,
QgsFields,
QgsField)
from qgis.testing import start_app, unittest
from utilities import unitTestDataPath

Expand Down Expand Up @@ -138,6 +145,10 @@ def test_SetGeometry(self):
myMessage = '\nExpected: %s\nGot: %s' % (myExpectedGeometry, myGeometry)
assert myGeometry is not None, myMessage

# set from QgsAbstractGeometry
feat.setGeometry(QgsPoint(12, 34))
self.assertEqual(feat.geometry().asWkt(), 'Point (12 34)')


if __name__ == '__main__':
unittest.main()

0 comments on commit e21ea25

Please sign in to comment.