Skip to content

Commit 26495db

Browse files
committedApr 3, 2017
[processing] Move dataobjects.getSupportedOutputVectorLayerExtensions
to QgsVectorFileWriter
1 parent 3e9c527 commit 26495db

File tree

10 files changed

+71
-27
lines changed

10 files changed

+71
-27
lines changed
 

‎python/core/qgsvectorfilewriter.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@ class QgsVectorFileWriter
357357

358358
/** Returns map with format filter string as key and OGR format key as value*/
359359
static QMap< QString, QString> supportedFiltersAndFormats();
360+
static QStringList supportedFormatExtensions();
360361

361362
/** Returns driver list that can be used for dialogs. It contains all OGR drivers
362363
* + some additional internal QGIS driver names to distinguish between more

‎python/plugins/processing/algs/gdal/GdalAlgorithm.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030

3131
from qgis.PyQt.QtCore import QUrl
3232

33-
from qgis.core import QgsApplication
33+
from qgis.core import (QgsApplication,
34+
QgsVectorFileWriter)
3435

3536
from processing.core.GeoAlgorithm import GeoAlgorithm
3637
from processing.algs.gdal.GdalAlgorithmDialog import GdalAlgorithmDialog
@@ -58,7 +59,7 @@ def getCustomParametersDialog(self):
5859
def processAlgorithm(self, feedback):
5960
commands = self.getConsoleCommands()
6061
layers = dataobjects.getVectorLayers()
61-
supported = dataobjects.getSupportedOutputVectorLayerExtensions()
62+
supported = QgsVectorFileWriter.supportedFormatExtensions()
6263
for i, c in enumerate(commands):
6364
for layer in layers:
6465
if layer.source() in c:

‎python/plugins/processing/core/AlgorithmProvider.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
__revision__ = '$Format:%H$'
2727

2828
from qgis.PyQt.QtCore import QCoreApplication
29-
from qgis.core import QgsProcessingProvider
29+
from qgis.core import (QgsProcessingProvider,
30+
QgsVectorFileWriter)
3031
from processing.core.ProcessingConfig import Setting, ProcessingConfig
3132
from processing.tools import dataobjects
3233

@@ -91,7 +92,7 @@ def getSupportedOutputRasterLayerExtensions(self):
9192
return ['tif']
9293

9394
def getSupportedOutputVectorLayerExtensions(self):
94-
return dataobjects.getSupportedOutputVectorLayerExtensions()
95+
return QgsVectorFileWriter.supportedFormatExtensions()
9596

9697
def getSupportedOutputTableExtensions(self):
9798
return ['csv']

‎python/plugins/processing/core/ProcessingConfig.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@
3030
import os
3131

3232
from qgis.PyQt.QtCore import QCoreApplication, QObject, pyqtSignal
33-
from qgis.core import NULL, QgsApplication, QgsSettings
33+
from qgis.core import (NULL,
34+
QgsApplication,
35+
QgsSettings,
36+
QgsVectorFileWriter)
3437
from processing.tools.system import defaultOutputFolder
3538
import processing.tools.dataobjects
3639

@@ -165,7 +168,7 @@ def initialize():
165168
valuetype=Setting.SELECTION,
166169
options=invalidFeaturesOptions))
167170

168-
extensions = processing.tools.dataobjects.getSupportedOutputVectorLayerExtensions()
171+
extensions = QgsVectorFileWriter.supportedFormatExtensions()
169172
ProcessingConfig.addSetting(Setting(
170173
ProcessingConfig.tr('General'),
171174
ProcessingConfig.DEFAULT_OUTPUT_VECTOR_LAYER_EXT,

‎python/plugins/processing/core/outputs.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,13 @@
3838
from processing.tools.vector import VectorWriter, TableWriter
3939
from processing.tools import dataobjects
4040

41-
from qgis.core import QgsExpressionContext, QgsExpressionContextUtils, QgsExpression, QgsExpressionContextScope, QgsProject, QgsSettings
41+
from qgis.core import (QgsExpressionContext,
42+
QgsExpressionContextUtils,
43+
QgsExpression,
44+
QgsExpressionContextScope,
45+
QgsProject,
46+
QgsSettings,
47+
QgsVectorFileWriter)
4248

4349

4450
def _expressionContext(alg):
@@ -316,7 +322,7 @@ def hasGeometry(self):
316322
return dataobjects.canUseVectorLayer(self.base_layer, [-1])
317323

318324
def getSupportedOutputVectorLayerExtensions(self):
319-
exts = dataobjects.getSupportedOutputVectorLayerExtensions()
325+
exts = QgsVectorFileWriter.supportedFormatExtensions()
320326
if not self.hasGeometry():
321327
exts = ['dbf'] + [ext for ext in exts if ext in VectorWriter.nogeometry_extensions]
322328
return exts

‎python/plugins/processing/core/parameters.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
from qgis.PyQt.QtCore import QCoreApplication
4141
from qgis.core import (QgsRasterLayer, QgsVectorLayer, QgsMapLayer, QgsCoordinateReferenceSystem,
4242
QgsExpressionContext, QgsExpressionContextUtils, QgsExpression, QgsExpressionContextScope,
43-
QgsProject)
43+
QgsProject,
44+
QgsVectorFileWriter)
4445

4546
from processing.tools.vector import resolveFieldIndex, features
4647
from processing.tools import dataobjects
@@ -751,7 +752,7 @@ def getFileFilter(self):
751752
elif self.datatype == dataobjects.TYPE_FILE:
752753
return self.tr('All files (*.*)', 'ParameterMultipleInput')
753754
else:
754-
exts = dataobjects.getSupportedOutputVectorLayerExtensions()
755+
exts = QgsVectorFileWriter.supportedFormatExtensions()
755756
for i in range(len(exts)):
756757
exts[i] = self.tr('{0} files (*.{1})', 'ParameterMultipleInput').format(exts[i].upper(), exts[i].lower())
757758
return ';;'.join(exts)
@@ -1523,7 +1524,7 @@ def getSafeExportedLayer(self):
15231524
return self.exported
15241525

15251526
def getFileFilter(self):
1526-
exts = dataobjects.getSupportedOutputVectorLayerExtensions()
1527+
exts = QgsVectorFileWriter.supportedFormatExtensions()
15271528
for i in range(len(exts)):
15281529
exts[i] = self.tr('{0} files (*.{1})', 'ParameterVector').format(exts[i].upper(), exts[i].lower())
15291530
return ';;'.join(exts)

‎python/plugins/processing/tools/dataobjects.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,20 +65,6 @@ def resetLoadedLayers():
6565
_loadedLayers = {}
6666

6767

68-
def getSupportedOutputVectorLayerExtensions():
69-
formats = QgsVectorFileWriter.supportedFiltersAndFormats()
70-
exts = []
71-
for extension in list(formats.keys()):
72-
extension = str(extension)
73-
extension = extension[extension.find('*.') + 2:]
74-
extension = extension[:extension.find(' ')]
75-
if extension.lower() != 'shp':
76-
exts.append(extension)
77-
exts.sort()
78-
exts.insert(0, 'shp') # shp is the default, should be the first
79-
return exts
80-
81-
8268
def getSupportedOutputRasterLayerExtensions():
8369
allexts = []
8470
for exts in list(GdalUtils.getSupportedRasters().values()):

‎src/core/qgsvectorfilewriter.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2604,6 +2604,35 @@ QMap< QString, QString> QgsVectorFileWriter::supportedFiltersAndFormats()
26042604
return resultMap;
26052605
}
26062606

2607+
QStringList QgsVectorFileWriter::supportedFormatExtensions()
2608+
{
2609+
QgsStringMap formats = supportedFiltersAndFormats();
2610+
QStringList extensions;
2611+
2612+
QRegularExpression rx( "\\*\\.([a-zA-Z0-9]*)" );
2613+
2614+
QgsStringMap::const_iterator formatIt = formats.constBegin();
2615+
for ( ; formatIt != formats.constEnd(); ++formatIt )
2616+
{
2617+
QString ext = formatIt.key();
2618+
QRegularExpressionMatch match = rx.match( ext );
2619+
if ( !match.hasMatch() )
2620+
continue;
2621+
2622+
QString matched = match.captured( 1 );
2623+
if ( matched.compare( QStringLiteral( "shp" ), Qt::CaseInsensitive ) == 0 )
2624+
continue;
2625+
2626+
extensions << matched;
2627+
}
2628+
2629+
std::sort( extensions.begin(), extensions.end() );
2630+
2631+
// Make https://twitter.com/shapefiIe a happy little fellow
2632+
extensions.insert( 0, QStringLiteral( "shp" ) );
2633+
return extensions;
2634+
}
2635+
26072636
QMap<QString, QString> QgsVectorFileWriter::ogrDriverList()
26082637
{
26092638
QMap<QString, QString> resultMap;

‎src/core/qgsvectorfilewriter.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,9 +432,19 @@ class CORE_EXPORT QgsVectorFileWriter
432432
//! QgsVectorFileWriter cannot be copied.
433433
QgsVectorFileWriter &operator=( const QgsVectorFileWriter &rh ) = delete;
434434

435-
//! Returns map with format filter string as key and OGR format key as value
435+
/**
436+
* Returns a map with format filter string as key and OGR format key as value.
437+
* \see supportedOutputVectorLayerExtensions()
438+
*/
436439
static QMap< QString, QString> supportedFiltersAndFormats();
437440

441+
/**
442+
* Returns a list of file extensions for supported formats.
443+
* \since QGIS 3.0
444+
* \see supportedFiltersAndFormats()
445+
*/
446+
static QStringList supportedFormatExtensions();
447+
438448
/** Returns driver list that can be used for dialogs. It contains all OGR drivers
439449
* + some additional internal QGIS driver names to distinguish between more
440450
* supported formats of the same OGR driver

‎tests/src/python/test_qgsvectorfilewriter.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def convert(self, idx, value):
6565
return 'unexpected_idx'
6666

6767

68-
class TestQgsVectorLayer(unittest.TestCase):
68+
class TestQgsVectorFileWriter(unittest.TestCase):
6969

7070
mMemoryLayer = None
7171

@@ -656,6 +656,12 @@ def testOverwriteLayer(self):
656656

657657
gdal.Unlink(filename)
658658

659+
def testSupportedFormatExtensions(self):
660+
formats = QgsVectorFileWriter.supportedFormatExtensions()
661+
self.assertTrue('gpkg' in formats)
662+
self.assertFalse('exe' in formats)
663+
self.assertEqual(formats[0], 'shp')
664+
659665

660666
if __name__ == '__main__':
661667
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.