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