[processing] Move dataobjects.getSupportedOutputVectorLayerExtensions

to QgsVectorFileWriter
This commit is contained in:
Nyall Dawson 2017-04-03 15:41:32 +10:00
parent 3e9c527dc7
commit 26495dbd81
10 changed files with 71 additions and 27 deletions

View File

@ -357,6 +357,7 @@ class QgsVectorFileWriter
/** Returns map with format filter string as key and OGR format key as value*/
static QMap< QString, QString> supportedFiltersAndFormats();
static QStringList supportedFormatExtensions();
/** Returns driver list that can be used for dialogs. It contains all OGR drivers
* + some additional internal QGIS driver names to distinguish between more

View File

@ -30,7 +30,8 @@ import re
from qgis.PyQt.QtCore import QUrl
from qgis.core import QgsApplication
from qgis.core import (QgsApplication,
QgsVectorFileWriter)
from processing.core.GeoAlgorithm import GeoAlgorithm
from processing.algs.gdal.GdalAlgorithmDialog import GdalAlgorithmDialog
@ -58,7 +59,7 @@ class GdalAlgorithm(GeoAlgorithm):
def processAlgorithm(self, feedback):
commands = self.getConsoleCommands()
layers = dataobjects.getVectorLayers()
supported = dataobjects.getSupportedOutputVectorLayerExtensions()
supported = QgsVectorFileWriter.supportedFormatExtensions()
for i, c in enumerate(commands):
for layer in layers:
if layer.source() in c:

View File

@ -26,7 +26,8 @@ __copyright__ = '(C) 2012, Victor Olaya'
__revision__ = '$Format:%H$'
from qgis.PyQt.QtCore import QCoreApplication
from qgis.core import QgsProcessingProvider
from qgis.core import (QgsProcessingProvider,
QgsVectorFileWriter)
from processing.core.ProcessingConfig import Setting, ProcessingConfig
from processing.tools import dataobjects
@ -91,7 +92,7 @@ class AlgorithmProvider(QgsProcessingProvider):
return ['tif']
def getSupportedOutputVectorLayerExtensions(self):
return dataobjects.getSupportedOutputVectorLayerExtensions()
return QgsVectorFileWriter.supportedFormatExtensions()
def getSupportedOutputTableExtensions(self):
return ['csv']

View File

@ -30,7 +30,10 @@ __revision__ = '$Format:%H$'
import os
from qgis.PyQt.QtCore import QCoreApplication, QObject, pyqtSignal
from qgis.core import NULL, QgsApplication, QgsSettings
from qgis.core import (NULL,
QgsApplication,
QgsSettings,
QgsVectorFileWriter)
from processing.tools.system import defaultOutputFolder
import processing.tools.dataobjects
@ -165,7 +168,7 @@ class ProcessingConfig(object):
valuetype=Setting.SELECTION,
options=invalidFeaturesOptions))
extensions = processing.tools.dataobjects.getSupportedOutputVectorLayerExtensions()
extensions = QgsVectorFileWriter.supportedFormatExtensions()
ProcessingConfig.addSetting(Setting(
ProcessingConfig.tr('General'),
ProcessingConfig.DEFAULT_OUTPUT_VECTOR_LAYER_EXT,

View File

@ -38,7 +38,13 @@ from processing.tools.system import isWindows, getTempFilenameInTempFolder, getT
from processing.tools.vector import VectorWriter, TableWriter
from processing.tools import dataobjects
from qgis.core import QgsExpressionContext, QgsExpressionContextUtils, QgsExpression, QgsExpressionContextScope, QgsProject, QgsSettings
from qgis.core import (QgsExpressionContext,
QgsExpressionContextUtils,
QgsExpression,
QgsExpressionContextScope,
QgsProject,
QgsSettings,
QgsVectorFileWriter)
def _expressionContext(alg):
@ -316,7 +322,7 @@ class OutputVector(Output):
return dataobjects.canUseVectorLayer(self.base_layer, [-1])
def getSupportedOutputVectorLayerExtensions(self):
exts = dataobjects.getSupportedOutputVectorLayerExtensions()
exts = QgsVectorFileWriter.supportedFormatExtensions()
if not self.hasGeometry():
exts = ['dbf'] + [ext for ext in exts if ext in VectorWriter.nogeometry_extensions]
return exts

View File

@ -40,7 +40,8 @@ from qgis.utils import iface
from qgis.PyQt.QtCore import QCoreApplication
from qgis.core import (QgsRasterLayer, QgsVectorLayer, QgsMapLayer, QgsCoordinateReferenceSystem,
QgsExpressionContext, QgsExpressionContextUtils, QgsExpression, QgsExpressionContextScope,
QgsProject)
QgsProject,
QgsVectorFileWriter)
from processing.tools.vector import resolveFieldIndex, features
from processing.tools import dataobjects
@ -751,7 +752,7 @@ class ParameterMultipleInput(ParameterDataObject):
elif self.datatype == dataobjects.TYPE_FILE:
return self.tr('All files (*.*)', 'ParameterMultipleInput')
else:
exts = dataobjects.getSupportedOutputVectorLayerExtensions()
exts = QgsVectorFileWriter.supportedFormatExtensions()
for i in range(len(exts)):
exts[i] = self.tr('{0} files (*.{1})', 'ParameterMultipleInput').format(exts[i].upper(), exts[i].lower())
return ';;'.join(exts)
@ -1523,7 +1524,7 @@ class ParameterVector(ParameterDataObject):
return self.exported
def getFileFilter(self):
exts = dataobjects.getSupportedOutputVectorLayerExtensions()
exts = QgsVectorFileWriter.supportedFormatExtensions()
for i in range(len(exts)):
exts[i] = self.tr('{0} files (*.{1})', 'ParameterVector').format(exts[i].upper(), exts[i].lower())
return ';;'.join(exts)

View File

@ -65,20 +65,6 @@ def resetLoadedLayers():
_loadedLayers = {}
def getSupportedOutputVectorLayerExtensions():
formats = QgsVectorFileWriter.supportedFiltersAndFormats()
exts = []
for extension in list(formats.keys()):
extension = str(extension)
extension = extension[extension.find('*.') + 2:]
extension = extension[:extension.find(' ')]
if extension.lower() != 'shp':
exts.append(extension)
exts.sort()
exts.insert(0, 'shp') # shp is the default, should be the first
return exts
def getSupportedOutputRasterLayerExtensions():
allexts = []
for exts in list(GdalUtils.getSupportedRasters().values()):

View File

@ -2604,6 +2604,35 @@ QMap< QString, QString> QgsVectorFileWriter::supportedFiltersAndFormats()
return resultMap;
}
QStringList QgsVectorFileWriter::supportedFormatExtensions()
{
QgsStringMap formats = supportedFiltersAndFormats();
QStringList extensions;
QRegularExpression rx( "\\*\\.([a-zA-Z0-9]*)" );
QgsStringMap::const_iterator formatIt = formats.constBegin();
for ( ; formatIt != formats.constEnd(); ++formatIt )
{
QString ext = formatIt.key();
QRegularExpressionMatch match = rx.match( ext );
if ( !match.hasMatch() )
continue;
QString matched = match.captured( 1 );
if ( matched.compare( QStringLiteral( "shp" ), Qt::CaseInsensitive ) == 0 )
continue;
extensions << matched;
}
std::sort( extensions.begin(), extensions.end() );
// Make https://twitter.com/shapefiIe a happy little fellow
extensions.insert( 0, QStringLiteral( "shp" ) );
return extensions;
}
QMap<QString, QString> QgsVectorFileWriter::ogrDriverList()
{
QMap<QString, QString> resultMap;

View File

@ -432,9 +432,19 @@ class CORE_EXPORT QgsVectorFileWriter
//! QgsVectorFileWriter cannot be copied.
QgsVectorFileWriter &operator=( const QgsVectorFileWriter &rh ) = delete;
//! Returns map with format filter string as key and OGR format key as value
/**
* Returns a map with format filter string as key and OGR format key as value.
* \see supportedOutputVectorLayerExtensions()
*/
static QMap< QString, QString> supportedFiltersAndFormats();
/**
* Returns a list of file extensions for supported formats.
* \since QGIS 3.0
* \see supportedFiltersAndFormats()
*/
static QStringList supportedFormatExtensions();
/** Returns driver list that can be used for dialogs. It contains all OGR drivers
* + some additional internal QGIS driver names to distinguish between more
* supported formats of the same OGR driver

View File

@ -65,7 +65,7 @@ class TestFieldValueConverter(QgsVectorFileWriter.FieldValueConverter):
return 'unexpected_idx'
class TestQgsVectorLayer(unittest.TestCase):
class TestQgsVectorFileWriter(unittest.TestCase):
mMemoryLayer = None
@ -656,6 +656,12 @@ class TestQgsVectorLayer(unittest.TestCase):
gdal.Unlink(filename)
def testSupportedFormatExtensions(self):
formats = QgsVectorFileWriter.supportedFormatExtensions()
self.assertTrue('gpkg' in formats)
self.assertFalse('exe' in formats)
self.assertEqual(formats[0], 'shp')
if __name__ == '__main__':
unittest.main()