@@ -423,14 +423,14 @@ void QgsLegendLayer::addToPopupMenu( QMenu& theMenu, QAction* toggleEditingActio
423
423
}
424
424
}
425
425
426
- // save as shapefile
427
- theMenu.addAction ( tr ( " Save as shapefile ..." ), this , SLOT ( saveAsShapefile () ) );
426
+ // save as vector file
427
+ theMenu.addAction ( tr ( " Save as..." ), this , SLOT ( saveAsVectorFile () ) );
428
428
429
- // save selection as shapefile
430
- QAction* saveSelectionAction = theMenu.addAction ( tr ( " Save selection as shapefile ..." ), this , SLOT ( saveSelectionAsShapefile () ) );
429
+ // save selection as vector file
430
+ QAction* saveSelectionAsAction = theMenu.addAction ( tr ( " Save selection as..." ), this , SLOT ( saveSelectionAsVectorFile () ) );
431
431
if ( vlayer->selectedFeatureCount () == 0 )
432
432
{
433
- saveSelectionAction ->setEnabled ( false );
433
+ saveSelectionAsAction ->setEnabled ( false );
434
434
}
435
435
436
436
theMenu.addSeparator ();
@@ -460,6 +460,16 @@ void QgsLegendLayer::saveSelectionAsShapefile()
460
460
saveAsShapefileGeneral ( TRUE );
461
461
}
462
462
463
+ void QgsLegendLayer::saveAsVectorFile ()
464
+ {
465
+ saveAsVectorFileGeneral ( false );
466
+ }
467
+
468
+ void QgsLegendLayer::saveSelectionAsVectorFile ()
469
+ {
470
+ saveAsVectorFileGeneral ( true );
471
+ }
472
+
463
473
// ////////
464
474
465
475
void QgsLegendLayer::setVisible ( bool visible )
@@ -492,7 +502,81 @@ void QgsLegendLayer::showInOverview()
492
502
legend ()->updateOverview ();
493
503
}
494
504
505
+ void QgsLegendLayer::saveAsVectorFileGeneral ( bool saveOnlySelection )
506
+ {
507
+ if ( mLyr .layer ()->type () != QgsMapLayer::VectorLayer )
508
+ return ;
509
+
510
+ QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer *>( mLyr .layer () );
495
511
512
+ // get output name and format
513
+ QSettings settings;
514
+ QString filter = QString ( " Shapefiles (*.shp)" );
515
+ QString dirName = settings.value ( " /UI/lastVectorfileDir" , " ." ).toString ();
516
+ QString filterString = QgsVectorFileWriter::fileFilterString ();
517
+ QString selectedFilter = settings.value ( " /UI/lastVectorFilter" , " [OGR] ESRI Shapefiles (*.shp *.SHP)" ).toString ();
518
+ QString outputFile = QFileDialog::getSaveFileName ( 0 , tr ( " Save layer as..." ), dirName, filterString, &selectedFilter );
519
+ if ( outputFile.isNull () )
520
+ {
521
+ return ; // cancelled
522
+ }
523
+
524
+ settings.setValue ( " /UI/lastVectorfileDir" , QFileInfo ( outputFile ).absolutePath () );
525
+ settings.setValue ( " /UI/lastVectorFilter" , selectedFilter );
526
+
527
+ QMap< QString, QString> filterDriverMap = QgsVectorFileWriter::supportedFiltersAndFormats ();
528
+ QMap< QString, QString>::const_iterator it = filterDriverMap.find ( selectedFilter + " ;;" );
529
+ if ( it == filterDriverMap.constEnd () )
530
+ {
531
+ return ; // unknown format
532
+ }
533
+
534
+ QString driverKey = *it;
535
+
536
+ // output CRS
537
+ QgsCoordinateReferenceSystem destCRS = vlayer->srs ();
538
+ // Find out if we have projections enabled or not
539
+ if ( QgisApp::instance ()->mapCanvas ()->mapRenderer ()->hasCrsTransformEnabled () )
540
+ {
541
+ destCRS = QgisApp::instance ()->mapCanvas ()->mapRenderer ()->destinationSrs ();
542
+ }
543
+
544
+ QgsGenericProjectionSelector * mySelector = new QgsGenericProjectionSelector ();
545
+ mySelector->setSelectedCrsId ( destCRS.srsid () );
546
+ mySelector->setMessage ( tr ( " Select the coordinate reference system for the saved shapefile. "
547
+ " The data points will be transformed from the layer coordinate reference system." ) );
548
+
549
+ if ( mySelector->exec () )
550
+ {
551
+ QgsCoordinateReferenceSystem srs ( mySelector->selectedCrsId (), QgsCoordinateReferenceSystem::InternalCrsId );
552
+ destCRS = srs;
553
+ // destCRS->createFromId(mySelector->selectedCrsId(), QgsCoordinateReferenceSystem::InternalCrsId)
554
+ }
555
+ else
556
+ {
557
+ // Aborted CS selection, don't save.
558
+ delete mySelector;
559
+ return ;
560
+ }
561
+ delete mySelector;
562
+
563
+ // overwrite the file - user will already have been prompted
564
+ // to verify they want to overwrite by the file dialog above
565
+ // might not even exists in the given case.
566
+ if ( driverKey == " ESRI Shapefile" )
567
+ {
568
+ // add the extension if not present
569
+ if ( !outputFile.endsWith ( " .shp" , Qt::CaseInsensitive ) )
570
+ {
571
+ outputFile += " .shp" ;
572
+ }
573
+ QgsVectorFileWriter::deleteShapeFile ( outputFile );
574
+ }
575
+
576
+ QString errorMessage;
577
+ QgsVectorFileWriter::WriterError error;
578
+ error = QgsVectorFileWriter::writeAsVectorFormat ( vlayer, outputFile, " utf-8" , &destCRS, driverKey, saveOnlySelection, &errorMessage );
579
+ }
496
580
497
581
498
582
void QgsLegendLayer::saveAsShapefileGeneral ( bool saveOnlySelection )
0 commit comments