QgsCompoundCurve *QgsCompoundCurve::curveSubstring( double startDistance, double endDistance ) const { if ( startDistance < 0 && endDistance < 0 ) return createEmptyWithSameType(); endDistance = std::max( startDistance, endDistance ); std::unique_ptr< QgsCompoundCurve > substring = qgis::make_unique< QgsCompoundCurve >(); double distanceTraversed = 0; for ( const QgsCurve *curve : mCurves ) { const double thisCurveLength = curve->length(); if ( distanceTraversed + thisCurveLength < startDistance ) { // keep going - haven't found start yet, so no need to include this curve at all } else { std::unique_ptr< QgsCurve > part( curve->curveSubstring( startDistance - distanceTraversed, endDistance - distanceTraversed ) ); if ( part ) substring->addCurve( part.release() ); } distanceTraversed += thisCurveLength; if ( distanceTraversed > endDistance ) break; } return substring.release(); }
QgsCurvePolygon *QgsCurvePolygon::snappedToGrid( double hSpacing, double vSpacing, double dSpacing, double mSpacing ) const { if ( !mExteriorRing ) return nullptr; std::unique_ptr< QgsCurvePolygon > polygon( createEmptyWithSameType() ); // exterior ring auto exterior = std::unique_ptr<QgsCurve> { static_cast< QgsCurve *>( mExteriorRing->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing ) ) }; if ( !exterior ) return nullptr; polygon->mExteriorRing = std::move( exterior ); //interior rings for ( auto interior : mInteriorRings ) { if ( !interior ) continue; QgsCurve *gridifiedInterior = static_cast< QgsCurve * >( interior->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing ) ); if ( !gridifiedInterior ) continue; polygon->mInteriorRings.append( gridifiedInterior ); } return polygon.release(); }
QgsLineString *QgsLineString::snappedToGrid( double hSpacing, double vSpacing, double dSpacing, double mSpacing ) const { // prepare result std::unique_ptr<QgsLineString> result { createEmptyWithSameType() }; bool res = snapToGridPrivate( hSpacing, vSpacing, dSpacing, mSpacing, mX, mY, mZ, mM, result->mX, result->mY, result->mZ, result->mM ); if ( res ) return result.release(); else return nullptr; }
QgsGeometryCollection *QgsGeometryCollection::snappedToGrid( double hSpacing, double vSpacing, double dSpacing, double mSpacing ) const { std::unique_ptr<QgsGeometryCollection> result; for ( auto geom : mGeometries ) { std::unique_ptr<QgsAbstractGeometry> gridified { geom->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing ) }; if ( gridified ) { if ( !result ) result = std::unique_ptr<QgsGeometryCollection> { createEmptyWithSameType() }; result->mGeometries.append( gridified.release() ); } } return result.release(); }
QgsCompoundCurve *QgsCompoundCurve::snappedToGrid( double hSpacing, double vSpacing, double dSpacing, double mSpacing ) const { std::unique_ptr<QgsCompoundCurve> result( createEmptyWithSameType() ); for ( QgsCurve *curve : mCurves ) { std::unique_ptr<QgsCurve> gridified( static_cast< QgsCurve * >( curve->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing ) ) ); if ( gridified ) { result->mCurves.append( gridified.release() ); } } if ( result->mCurves.empty() ) return nullptr; else return result.release(); }