Skip to content

Commit

Permalink
Add addPartWkbType and use it for QgsCurve addPart (#89)
Browse files Browse the repository at this point in the history
Fixes #57255.

Dedicated PR will be submitted for master branch
that will aim deprecate all addPart methods of
QgsGeometry and create equivalents V2, using
more precise Qgis::WkbType instead of Qgis::GeometryType.
  • Loading branch information
Djedouas authored and lbartoletti committed Jun 4, 2024
1 parent 51ec497 commit 27266a2
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 1 deletion.
10 changes: 10 additions & 0 deletions python/PyQt6/core/auto_generated/geometry/qgsgeometry.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -899,6 +899,16 @@ Adds a new part to this geometry.
:param part: part to add (ownership is transferred)
:param geomType: default geometry type to create if no existing geometry

:return: OperationResult a result code: success or reason of failure
%End

Qgis::GeometryOperationResult addPartWkbType( QgsAbstractGeometry *part /Transfer/, Qgis::WkbType wkbType = Qgis::WkbType::Unknown );
%Docstring
Adds a new part to this geometry.

:param part: part to add (ownership is transferred)
:param wkbType: default WKB type to create if no existing geometry

:return: OperationResult a result code: success or reason of failure
%End

Expand Down
10 changes: 10 additions & 0 deletions python/core/auto_generated/geometry/qgsgeometry.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -899,6 +899,16 @@ Adds a new part to this geometry.
:param part: part to add (ownership is transferred)
:param geomType: default geometry type to create if no existing geometry

:return: OperationResult a result code: success or reason of failure
%End

Qgis::GeometryOperationResult addPartWkbType( QgsAbstractGeometry *part /Transfer/, Qgis::WkbType wkbType = Qgis::WkbType::Unknown );
%Docstring
Adds a new part to this geometry.

:param part: part to add (ownership is transferred)
:param wkbType: default WKB type to create if no existing geometry

:return: OperationResult a result code: success or reason of failure
%End

Expand Down
36 changes: 36 additions & 0 deletions src/core/geometry/qgsgeometry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -935,6 +935,42 @@ Qgis::GeometryOperationResult QgsGeometry::addPart( const QgsPointSequence &poin
return addPart( partGeom.release(), geomType );
}

Qgis::GeometryOperationResult QgsGeometry::addPartWkbType( QgsAbstractGeometry *part, Qgis::WkbType wkbType )
{
std::unique_ptr< QgsAbstractGeometry > p( part );
if ( !d->geometry )
{
switch ( QgsWkbTypes::flatType( wkbType ) )
{
case Qgis::WkbType::Point:
reset( std::make_unique< QgsMultiPoint >() );
break;
case Qgis::WkbType::LineString:
reset( std::make_unique< QgsMultiLineString >() );
break;
case Qgis::WkbType::Polygon:
reset( std::make_unique< QgsMultiPolygon >() );
break;
case Qgis::WkbType::CurvePolygon:
reset( std::make_unique< QgsMultiSurface >() );
break;
case Qgis::WkbType::CompoundCurve:
reset( std::make_unique< QgsMultiCurve >() );
break;
default:
reset( nullptr );
return Qgis::GeometryOperationResult::AddPartNotMultiGeometry;
}
}
else
{
detach();
}

convertToMultiType();
return QgsGeometryEditUtils::addPart( d->geometry.get(), std::move( p ) );
}

Qgis::GeometryOperationResult QgsGeometry::addPart( QgsAbstractGeometry *part, Qgis::GeometryType geomType )
{
std::unique_ptr< QgsAbstractGeometry > p( part );
Expand Down
8 changes: 8 additions & 0 deletions src/core/geometry/qgsgeometry.h
Original file line number Diff line number Diff line change
Expand Up @@ -943,6 +943,14 @@ class CORE_EXPORT QgsGeometry
*/
Qgis::GeometryOperationResult addPart( QgsAbstractGeometry *part SIP_TRANSFER, Qgis::GeometryType geomType = Qgis::GeometryType::Unknown );

/**
* Adds a new part to this geometry.
* \param part part to add (ownership is transferred)
* \param wkbType default WKB type to create if no existing geometry
* \returns OperationResult a result code: success or reason of failure
*/
Qgis::GeometryOperationResult addPartWkbType( QgsAbstractGeometry *part SIP_TRANSFER, Qgis::WkbType wkbType = Qgis::WkbType::Unknown );

/**
* Adds a new island polygon to a multipolygon feature
* \returns OperationResult a result code: success or reason of failure
Expand Down
2 changes: 1 addition & 1 deletion src/core/vector/qgsvectorlayereditutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ Qgis::GeometryOperationResult QgsVectorLayerEditUtils::addPart( QgsCurve *ring,
geometry = f.geometry();
}

Qgis::GeometryOperationResult errorCode = geometry.addPart( ring, mLayer->geometryType() );
Qgis::GeometryOperationResult errorCode = geometry.addPartWkbType( ring, mLayer->wkbType() );
if ( errorCode == Qgis::GeometryOperationResult::Success )
{
if ( firstPart && QgsWkbTypes::isSingleType( mLayer->wkbType() )
Expand Down

0 comments on commit 27266a2

Please sign in to comment.