Skip to content

Commit e21ea25

Browse files
committedNov 20, 2018
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)))
1 parent 17e5873 commit e21ea25

File tree

5 files changed

+59
-3
lines changed

5 files changed

+59
-3
lines changed
 

‎python/core/auto_generated/qgsfeature.sip.in

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414

1515

16-
1716
class QgsFeature
1817
{
1918
%Docstring
@@ -329,6 +328,21 @@ Set the feature's geometry. The feature will be valid after.
329328
.. seealso:: :py:func:`clearGeometry`
330329
%End
331330

331+
void setGeometry( QgsAbstractGeometry *geometry /Transfer/ );
332+
%Docstring
333+
Set the feature's ``geometry``. Ownership of the geometry is transferred to the feature.
334+
The feature will be made valid after calling this method.
335+
336+
.. seealso:: :py:func:`geometry`
337+
338+
.. seealso:: :py:func:`clearGeometry`
339+
340+
.. versionadded:: 3.6
341+
%End
342+
%MethodCode
343+
sipCpp->setGeometry( std::unique_ptr< QgsAbstractGeometry>( a0 ) );
344+
%End
345+
332346
void clearGeometry();
333347
%Docstring
334348
Removes any geometry associated with the feature.

‎src/core/qgsfeature.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,13 @@ void QgsFeature::setGeometry( const QgsGeometry &geometry )
141141
d->valid = true;
142142
}
143143

144+
void QgsFeature::setGeometry( std::unique_ptr<QgsAbstractGeometry> geometry )
145+
{
146+
d.detach();
147+
d->geometry = QgsGeometry( std::move( geometry ) );
148+
d->valid = true;
149+
}
150+
144151
void QgsFeature::clearGeometry()
145152
{
146153
setGeometry( QgsGeometry() );

‎src/core/qgsfeature.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@ email : sherman at mrcc.com
3030
#include "qgsattributes.h"
3131
#include "qgsfields.h"
3232
#include "qgsfeatureid.h"
33-
33+
#include <memory>
3434
class QgsFeature;
3535
class QgsFeaturePrivate;
3636
class QgsField;
3737
class QgsGeometry;
3838
class QgsRectangle;
39+
class QgsAbstractGeometry;
3940

4041

4142
/***************************************************************************
@@ -345,6 +346,22 @@ class CORE_EXPORT QgsFeature
345346
*/
346347
void setGeometry( const QgsGeometry &geometry );
347348

349+
/**
350+
* Set the feature's \a geometry. Ownership of the geometry is transferred to the feature.
351+
* The feature will be made valid after calling this method.
352+
* \see geometry()
353+
* \see clearGeometry()
354+
* \since QGIS 3.6
355+
*/
356+
#ifndef SIP_RUN
357+
void setGeometry( std::unique_ptr< QgsAbstractGeometry > geometry );
358+
#else
359+
void setGeometry( QgsAbstractGeometry *geometry SIP_TRANSFER );
360+
% MethodCode
361+
sipCpp->setGeometry( std::unique_ptr< QgsAbstractGeometry>( a0 ) );
362+
% End
363+
#endif
364+
348365
/**
349366
* Removes any geometry associated with the feature.
350367
* \see setGeometry()

‎tests/src/core/testqgsfeature.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,13 @@ void TestQgsFeature::geometry()
306306
QCOMPARE( copy.geometry().asWkb(), geomByRef.asWkb() );
307307
QCOMPARE( feature.geometry().asWkb(), mGeometry.asWkb() );
308308

309+
//setGeometry using abstract geom
310+
copy = feature;
311+
QCOMPARE( copy.geometry().asWkb(), mGeometry.asWkb() );
312+
copy.setGeometry( qgis::make_unique< QgsPoint >( 5, 6 ) );
313+
QCOMPARE( copy.geometry().asWkt(), QStringLiteral( "Point (5 6)" ) );
314+
QCOMPARE( feature.geometry().asWkb(), mGeometry.asWkb() );
315+
309316
//clearGeometry
310317
QgsFeature geomFeature;
311318
geomFeature.setGeometry( QgsGeometry( mGeometry2 ) );

‎tests/src/python/test_qgsfeature.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,14 @@
1515
import qgis # NOQA
1616

1717
import os
18-
from qgis.core import QgsFeature, QgsGeometry, QgsPointXY, QgsVectorLayer, NULL, QgsFields, QgsField
18+
from qgis.core import (QgsFeature,
19+
QgsPoint,
20+
QgsGeometry,
21+
QgsPointXY,
22+
QgsVectorLayer,
23+
NULL,
24+
QgsFields,
25+
QgsField)
1926
from qgis.testing import start_app, unittest
2027
from utilities import unitTestDataPath
2128

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

148+
# set from QgsAbstractGeometry
149+
feat.setGeometry(QgsPoint(12, 34))
150+
self.assertEqual(feat.geometry().asWkt(), 'Point (12 34)')
151+
141152

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

0 commit comments

Comments
 (0)
Please sign in to comment.