QgsGeometry* QgsMapToolOffsetCurve::createOriginGeometry( QgsVectorLayer* vl, const QgsPointLocator::Match& match, QgsFeature& snappedFeature ) { if ( !vl ) { return 0; } mMultiPartGeometry = false; //assign feature part by vertex number (snap to vertex) or by before vertex number (snap to segment) int partVertexNr = match.vertexIndex(); if ( vl == currentVectorLayer() && !mForceCopy ) { //don't consider selected geometries, only the snap result return convertToSingleLine( snappedFeature.geometryAndOwnership(), partVertexNr, mMultiPartGeometry ); } else //snapped to a background layer { //if source layer is polygon / multipolygon, create a linestring from the snapped ring if ( vl->geometryType() == QGis::Polygon ) { //make linestring from polygon ring and return this geometry return linestringFromPolygon( snappedFeature.geometry(), partVertexNr ); } //for background layers, try to merge selected entries together if snapped feature is contained in selection const QgsFeatureIds& selection = vl->selectedFeaturesIds(); if ( selection.size() < 1 || !selection.contains( match.featureId() ) ) { return convertToSingleLine( snappedFeature.geometryAndOwnership(), partVertexNr, mMultiPartGeometry ); } else { //merge together if several features QgsFeatureList selectedFeatures = vl->selectedFeatures(); QgsFeatureList::iterator selIt = selectedFeatures.begin(); QgsGeometry* geom = selIt->geometryAndOwnership(); ++selIt; for ( ; selIt != selectedFeatures.end(); ++selIt ) { QgsGeometry* combined = geom->combine( selIt->geometry() ); delete geom; geom = combined; } //if multitype, return only the snapped to geometry if ( geom->isMultipart() ) { delete geom; return convertToSingleLine( snappedFeature.geometryAndOwnership(), match.vertexIndex(), mMultiPartGeometry ); } return geom; } } }
QgsGeometry* QgsMapToolOffsetCurve::createOriginGeometry( QgsVectorLayer* vl, const QgsPointLocator::Match& match, QgsFeature& snappedFeature ) { if ( !vl ) { return nullptr; } mMultiPartGeometry = false; //assign feature part by vertex number (snap to vertex) or by before vertex number (snap to segment) int partVertexNr = match.vertexIndex(); if ( vl == currentVectorLayer() && !mForceCopy ) { Q_NOWARN_DEPRECATED_PUSH //don't consider selected geometries, only the snap result return convertToSingleLine( snappedFeature.geometryAndOwnership(), partVertexNr, mMultiPartGeometry ); Q_NOWARN_DEPRECATED_POP }