Skip to content

Commit 213e4d4

Browse files
author
wonder
committed
Added saving layer's selection as a shapefile. Can be invoked from legend.
git-svn-id: http://svn.osgeo.org/qgis/trunk@6940 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 7ef07b3 commit 213e4d4

File tree

7 files changed

+57
-7
lines changed

7 files changed

+57
-7
lines changed

python/core/qgsvectorfilewriter.sip

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ public:
2727
/** Write contents of vector layer to a shapefile */
2828
static WriterError writeAsShapefile(QgsVectorLayer* layer,
2929
const QString& shapefileName,
30-
const QString& fileEncoding);
30+
const QString& fileEncoding,
31+
bool onlySelected = FALSE);
3132

3233

3334
/** create shapefile and initialize it */

src/app/legend/qgslegendlayer.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,10 +513,17 @@ void QgsLegendLayer::addToPopupMenu(QMenu& theMenu)
513513
}
514514

515515
// save as shapefile
516-
theMenu.addAction(tr("Save as shapefile..."), this, SLOT(saveAsShapefile()));
516+
QAction* saveShpAction = theMenu.addAction(tr("Save as shapefile..."), this, SLOT(saveAsShapefile()));
517517
if (files.size() != 1)
518518
{
519-
tableAction->setEnabled(false);
519+
saveShpAction->setEnabled(false);
520+
}
521+
522+
// save selection as shapefile
523+
QAction* saveSelectionAction = theMenu.addAction(tr("Save selection as shapefile..."), this, SLOT(saveSelectionAsShapefile()));
524+
if (files.size() != 1 || theVectorLayer->selectedFeatureCount() == 0)
525+
{
526+
saveSelectionAction->setEnabled(false);
520527
}
521528

522529
theMenu.addSeparator();
@@ -598,3 +605,12 @@ void QgsLegendLayer::saveAsShapefile()
598605
maplayers.front()->saveAsShapefile();
599606
}
600607
}
608+
609+
void QgsLegendLayer::saveSelectionAsShapefile()
610+
{
611+
std::list<QgsLegendLayerFile*> maplayers = legendLayerFiles();
612+
if (maplayers.size() == 1)
613+
{
614+
maplayers.front()->saveSelectionAsShapefile();
615+
}
616+
}

src/app/legend/qgslegendlayer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ class QgsLegendLayer : public QgsLegendItem
9191
void toggleEditing();
9292

9393
void saveAsShapefile();
94+
void saveSelectionAsShapefile();
9495

9596
protected:
9697

src/app/legend/qgslegendlayerfile.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,16 @@ void QgsLegendLayerFile::closeTable(bool onlyGeometryWasChanged)
293293
}
294294

295295
void QgsLegendLayerFile::saveAsShapefile()
296+
{
297+
saveAsShapefileGeneral(FALSE);
298+
}
299+
300+
void QgsLegendLayerFile::saveSelectionAsShapefile()
301+
{
302+
saveAsShapefileGeneral(TRUE);
303+
}
304+
305+
void QgsLegendLayerFile::saveAsShapefileGeneral(bool saveOnlySelection)
296306
{
297307
if (mLyr.layer()->type() != QgsMapLayer::VECTOR)
298308
return;
@@ -333,8 +343,12 @@ void QgsLegendLayerFile::saveAsShapefile()
333343
shapefileName += ".shp";
334344
}
335345

346+
QApplication::setOverrideCursor(Qt::waitCursor);
347+
336348
QgsVectorFileWriter::WriterError error;
337-
error = QgsVectorFileWriter::writeAsShapefile(vlayer, shapefileName, encoding);
349+
error = QgsVectorFileWriter::writeAsShapefile(vlayer, shapefileName, encoding, saveOnlySelection);
350+
351+
QApplication::restoreOverrideCursor();
338352

339353
switch (error)
340354
{
@@ -460,6 +474,12 @@ void QgsLegendLayerFile::addToPopupMenu(QMenu& theMenu)
460474
// save as shapefile
461475
theMenu.addAction(tr("Save as shapefile..."), this, SLOT(saveAsShapefile()));
462476

477+
QAction* saveSelectionAction = theMenu.addAction(tr("Save selection as shapefile..."), this, SLOT(saveSelectionAsShapefile()));
478+
if (vlayer->selectedFeatureCount() == 0)
479+
{
480+
saveSelectionAction->setEnabled(false);
481+
}
482+
463483
theMenu.addSeparator();
464484
}
465485
else if (lyr->type() == QgsMapLayer::RASTER)

src/app/legend/qgslegendlayerfile.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ class QgsLegendLayerFile : public QgsLegendItem
8383
/**Save as shapefile*/
8484
void saveAsShapefile();
8585

86+
/**Save selection as shapefile*/
87+
void saveSelectionAsShapefile();
88+
8689
/**Toggle editing for layer*/
8790
void toggleEditing();
8891

@@ -94,6 +97,9 @@ class QgsLegendLayerFile : public QgsLegendItem
9497

9598
protected:
9699

100+
/**Save as shapefile (called from saveAsShapefile and saveSelectionAsShapefile)*/
101+
void saveAsShapefileGeneral(bool saveOnlySelection);
102+
97103
/** layer identified by its layer id */
98104
QgsMapCanvasLayer mLyr;
99105

src/core/qgsvectorfilewriter.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,8 @@ QgsVectorFileWriter::~QgsVectorFileWriter()
292292
QgsVectorFileWriter::WriterError
293293
QgsVectorFileWriter::writeAsShapefile(QgsVectorLayer* layer,
294294
const QString& shapefileName,
295-
const QString& fileEncoding)
295+
const QString& fileEncoding,
296+
bool onlySelected)
296297
{
297298

298299
QgsVectorDataProvider* provider = layer->getDataProvider();
@@ -313,14 +314,18 @@ QgsVectorFileWriter::WriterError
313314

314315
provider->select(allAttr, QgsRect(), true);
315316

317+
const QgsFeatureIds& ids = layer->selectedFeaturesIds();
318+
316319
// write all features
317320
while (provider->getNextFeature(fet))
318321
{
322+
if (onlySelected && !ids.contains(fet.featureId()))
323+
continue;
324+
319325
writer->addFeature(fet);
320326
}
321327

322328
delete writer;
323329

324330
return NoError;
325331
}
326-

src/core/qgsvectorfilewriter.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ class CORE_EXPORT QgsVectorFileWriter
5353
/** Write contents of vector layer to a shapefile */
5454
static WriterError writeAsShapefile(QgsVectorLayer* layer,
5555
const QString& shapefileName,
56-
const QString& fileEncoding);
56+
const QString& fileEncoding,
57+
bool onlySelected = FALSE);
5758

5859

5960
/** create shapefile and initialize it */

0 commit comments

Comments
 (0)