Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsvectorlayertools.cpp 3 : : --------------------- 4 : : begin : 09.11.2016 5 : : copyright : (C) 2016 by Denis Rouzaud 6 : : email : denis.rouzaud@gmail.com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : 17 : : #include "qgsvectorlayer.h" 18 : : #include "qgsvectorlayertools.h" 19 : : #include "qgsfeaturerequest.h" 20 : : #include "qgslogger.h" 21 : : #include "qgsvectorlayerutils.h" 22 : : 23 : : 24 : 0 : QgsVectorLayerTools::QgsVectorLayerTools() 25 : 0 : : QObject( nullptr ) 26 : 0 : {} 27 : : 28 : 0 : bool QgsVectorLayerTools::copyMoveFeatures( QgsVectorLayer *layer, QgsFeatureRequest &request, double dx, double dy, QString *errorMsg, const bool topologicalEditing, QgsVectorLayer *topologicalLayer ) const 29 : : { 30 : 0 : bool res = false; 31 : 0 : if ( !layer || !layer->isEditable() ) 32 : : { 33 : 0 : return false; 34 : : } 35 : : 36 : 0 : QgsFeatureIterator fi = layer->getFeatures( request ); 37 : 0 : QgsFeature f; 38 : : 39 : 0 : int browsedFeatureCount = 0; 40 : 0 : int couldNotWriteCount = 0; 41 : 0 : int noGeometryCount = 0; 42 : : 43 : 0 : QgsFeatureIds fidList; 44 : : 45 : 0 : while ( fi.nextFeature( f ) ) 46 : : { 47 : 0 : browsedFeatureCount++; 48 : : 49 : 0 : QgsFeature newFeature = QgsVectorLayerUtils::createFeature( layer, f.geometry(), f.attributes().toMap() ); 50 : : 51 : : // translate 52 : 0 : if ( newFeature.hasGeometry() ) 53 : : { 54 : 0 : QgsGeometry geom = newFeature.geometry(); 55 : 0 : geom.translate( dx, dy ); 56 : 0 : newFeature.setGeometry( geom ); 57 : : #ifdef QGISDEBUG 58 : : const QgsFeatureId fid = newFeature.id(); 59 : : #endif 60 : : // paste feature 61 : 0 : if ( !layer->addFeature( newFeature ) ) 62 : : { 63 : 0 : couldNotWriteCount++; 64 : 0 : QgsDebugMsg( QStringLiteral( "Could not add new feature. Original copied feature id: %1" ).arg( fid ) ); 65 : 0 : } 66 : : else 67 : : { 68 : 0 : fidList.insert( newFeature.id() ); 69 : 0 : if ( topologicalEditing ) 70 : : { 71 : 0 : if ( topologicalLayer ) 72 : : { 73 : 0 : topologicalLayer->addTopologicalPoints( geom ); 74 : 0 : } 75 : 0 : layer->addTopologicalPoints( geom ); 76 : 0 : } 77 : : } 78 : 0 : } 79 : : else 80 : : { 81 : 0 : noGeometryCount++; 82 : : } 83 : 0 : } 84 : : 85 : 0 : request = QgsFeatureRequest(); 86 : 0 : request.setFilterFids( fidList ); 87 : : 88 : 0 : if ( !couldNotWriteCount && !noGeometryCount ) 89 : : { 90 : 0 : res = true; 91 : 0 : } 92 : 0 : else if ( errorMsg ) 93 : : { 94 : 0 : errorMsg = new QString( tr( "Only %1 out of %2 features were copied." ) 95 : 0 : .arg( browsedFeatureCount - couldNotWriteCount - noGeometryCount, browsedFeatureCount ) ); 96 : 0 : if ( noGeometryCount ) 97 : : { 98 : 0 : errorMsg->append( " " ); 99 : 0 : errorMsg->append( tr( "Some features have no geometry." ) ); 100 : 0 : } 101 : 0 : if ( couldNotWriteCount ) 102 : : { 103 : 0 : errorMsg->append( " " ); 104 : 0 : errorMsg->append( tr( "Some could not be created on the layer." ) ); 105 : 0 : } 106 : 0 : } 107 : 0 : return res; 108 : 0 : } 109 : : 110 : 0 : bool QgsVectorLayerTools::forceSuppressFormPopup() const 111 : : { 112 : 0 : return mForceSuppressFormPopup; 113 : : } 114 : : 115 : 0 : void QgsVectorLayerTools::setForceSuppressFormPopup( bool forceSuppressFormPopup ) 116 : : { 117 : 0 : mForceSuppressFormPopup = forceSuppressFormPopup; 118 : 0 : }