Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsprocessingprovider.cpp 3 : : -------------------------- 4 : : begin : December 2016 5 : : copyright : (C) 2016 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #include "qgsprocessingprovider.h" 19 : : #include "qgsapplication.h" 20 : : #include "qgsvectorfilewriter.h" 21 : : #include "qgsrasterfilewriter.h" 22 : : #include "qgssettings.h" 23 : : 24 : 0 : QgsProcessingProvider::QgsProcessingProvider( QObject *parent SIP_TRANSFERTHIS ) 25 : 0 : : QObject( parent ) 26 : 0 : {} 27 : : 28 : : 29 : 0 : QgsProcessingProvider::~QgsProcessingProvider() 30 : 0 : { 31 : 0 : qDeleteAll( mAlgorithms ); 32 : 0 : } 33 : : 34 : 0 : QIcon QgsProcessingProvider::icon() const 35 : : { 36 : 0 : return QgsApplication::getThemeIcon( "/processingAlgorithm.svg" ); 37 : 0 : } 38 : : 39 : 0 : QString QgsProcessingProvider::svgIconPath() const 40 : : { 41 : 0 : return QgsApplication::iconPath( QStringLiteral( "processingAlgorithm.svg" ) ); 42 : 0 : } 43 : : 44 : 0 : QgsProcessingProvider::Flags QgsProcessingProvider::flags() const 45 : : { 46 : 0 : return QgsProcessingProvider::Flags(); 47 : : } 48 : : 49 : 0 : QString QgsProcessingProvider::helpId() const 50 : : { 51 : 0 : return QString(); 52 : : } 53 : : 54 : 0 : QString QgsProcessingProvider::longName() const 55 : : { 56 : 0 : return name(); 57 : : } 58 : : 59 : 0 : QString QgsProcessingProvider::versionInfo() const 60 : : { 61 : 0 : return QString(); 62 : : } 63 : : 64 : 0 : QStringList QgsProcessingProvider::supportedOutputRasterLayerExtensions() const 65 : : { 66 : 0 : return QgsRasterFileWriter::supportedFormatExtensions(); 67 : : } 68 : : 69 : 0 : void QgsProcessingProvider::refreshAlgorithms() 70 : : { 71 : 0 : qDeleteAll( mAlgorithms ); 72 : 0 : mAlgorithms.clear(); 73 : 0 : if ( isActive() ) 74 : : { 75 : 0 : loadAlgorithms(); 76 : 0 : emit algorithmsLoaded(); 77 : 0 : } 78 : 0 : } 79 : : 80 : 0 : QList<const QgsProcessingAlgorithm *> QgsProcessingProvider::algorithms() const 81 : : { 82 : 0 : return mAlgorithms.values(); 83 : : } 84 : : 85 : 0 : const QgsProcessingAlgorithm *QgsProcessingProvider::algorithm( const QString &name ) const 86 : : { 87 : 0 : return mAlgorithms.value( name ); 88 : : } 89 : : 90 : 0 : bool QgsProcessingProvider::addAlgorithm( QgsProcessingAlgorithm *algorithm ) 91 : : { 92 : 0 : if ( !algorithm ) 93 : 0 : return false; 94 : : 95 : 0 : if ( mAlgorithms.contains( algorithm->name() ) ) 96 : : { 97 : 0 : QgsMessageLog::logMessage( tr( "Duplicate algorithm name %1 for provider %2" ).arg( algorithm->name(), id() ), QObject::tr( "Processing" ) ); 98 : 0 : return false; 99 : : } 100 : : 101 : : // init the algorithm - this allows direct querying of the algorithm's parameters 102 : : // and outputs from the provider's copy 103 : 0 : algorithm->initAlgorithm( QVariantMap() ); 104 : : 105 : 0 : algorithm->setProvider( this ); 106 : 0 : mAlgorithms.insert( algorithm->name(), algorithm ); 107 : 0 : return true; 108 : 0 : } 109 : : 110 : 0 : QStringList QgsProcessingProvider::supportedOutputVectorLayerExtensions() const 111 : : { 112 : 0 : return QgsVectorFileWriter::supportedFormatExtensions(); 113 : : } 114 : : 115 : 0 : QStringList QgsProcessingProvider::supportedOutputTableExtensions() const 116 : : { 117 : 0 : return supportedOutputVectorLayerExtensions(); 118 : : } 119 : : 120 : 0 : bool QgsProcessingProvider::isSupportedOutputValue( const QVariant &outputValue, const QgsProcessingDestinationParameter *parameter, QgsProcessingContext &context, QString &error ) const 121 : : { 122 : 0 : error.clear(); 123 : 0 : QString outputPath = QgsProcessingParameters::parameterAsOutputLayer( parameter, outputValue, context ).trimmed(); 124 : : 125 : 0 : if ( outputPath.isEmpty() ) 126 : : { 127 : 0 : if ( parameter->flags() & QgsProcessingParameterDefinition::FlagOptional ) 128 : : { 129 : 0 : return true; 130 : : } 131 : : else 132 : : { 133 : 0 : error = tr( "Missing parameter value %1" ).arg( parameter->description() ); 134 : 0 : return false; 135 : : } 136 : : } 137 : : 138 : 0 : if ( parameter->type() == QgsProcessingParameterVectorDestination::typeName() 139 : 0 : || parameter->type() == QgsProcessingParameterFeatureSink::typeName() ) 140 : : { 141 : 0 : if ( outputPath.startsWith( QLatin1String( "memory:" ) ) ) 142 : : { 143 : 0 : if ( !supportsNonFileBasedOutput() ) 144 : : { 145 : 0 : error = tr( "This algorithm only supports disk-based outputs" ); 146 : 0 : return false; 147 : : } 148 : 0 : return true; 149 : : } 150 : : 151 : 0 : QString providerKey; 152 : 0 : QString uri; 153 : 0 : QString layerName; 154 : 0 : QMap<QString, QVariant> options; 155 : 0 : bool useWriter = false; 156 : 0 : QString format; 157 : 0 : QString extension; 158 : 0 : QgsProcessingUtils::parseDestinationString( outputPath, providerKey, uri, layerName, format, options, useWriter, extension ); 159 : : 160 : 0 : if ( providerKey != QLatin1String( "ogr" ) ) 161 : : { 162 : 0 : if ( !supportsNonFileBasedOutput() ) 163 : : { 164 : 0 : error = tr( "This algorithm only supports disk-based outputs" ); 165 : 0 : return false; 166 : : } 167 : 0 : return true; 168 : : } 169 : : 170 : 0 : if ( !supportedOutputVectorLayerExtensions().contains( extension, Qt::CaseInsensitive ) ) 171 : : { 172 : 0 : error = tr( "“.%1” files are not supported as outputs for this algorithm" ).arg( extension ); 173 : 0 : return false; 174 : : } 175 : 0 : return true; 176 : 0 : } 177 : 0 : else if ( parameter->type() == QgsProcessingParameterRasterDestination::typeName() ) 178 : : { 179 : 0 : QFileInfo fi( outputPath ); 180 : 0 : const QString extension = fi.completeSuffix(); 181 : 0 : if ( !supportedOutputRasterLayerExtensions().contains( extension, Qt::CaseInsensitive ) ) 182 : : { 183 : 0 : error = tr( "“.%1” files are not supported as outputs for this algorithm" ).arg( extension ); 184 : 0 : return false; 185 : : } 186 : 0 : return true; 187 : 0 : } 188 : : else 189 : : { 190 : 0 : return true; 191 : : } 192 : 0 : } 193 : : 194 : 0 : QString QgsProcessingProvider::defaultVectorFileExtension( bool hasGeometry ) const 195 : : { 196 : 0 : QgsSettings settings; 197 : 0 : const QString userDefault = QgsProcessingUtils::defaultVectorExtension(); 198 : : 199 : 0 : const QStringList supportedExtensions = supportedOutputVectorLayerExtensions(); 200 : 0 : if ( supportedExtensions.contains( userDefault, Qt::CaseInsensitive ) ) 201 : : { 202 : : // user set default is supported by provider, use that 203 : 0 : return userDefault; 204 : : } 205 : 0 : else if ( !supportedExtensions.empty() ) 206 : : { 207 : 0 : return supportedExtensions.at( 0 ); 208 : : } 209 : : else 210 : : { 211 : : // who knows? provider says it has no file support at all... 212 : : // let's say shp. even MapInfo supports shapefiles. 213 : 0 : return hasGeometry ? QStringLiteral( "shp" ) : QStringLiteral( "dbf" ); 214 : : } 215 : 0 : } 216 : : 217 : 0 : QString QgsProcessingProvider::defaultRasterFileExtension() const 218 : : { 219 : 0 : QgsSettings settings; 220 : 0 : const QString userDefault = QgsProcessingUtils::defaultRasterExtension(); 221 : : 222 : 0 : const QStringList supportedExtensions = supportedOutputRasterLayerExtensions(); 223 : 0 : if ( supportedExtensions.contains( userDefault, Qt::CaseInsensitive ) ) 224 : : { 225 : : // user set default is supported by provider, use that 226 : 0 : return userDefault; 227 : : } 228 : 0 : else if ( !supportedExtensions.empty() ) 229 : : { 230 : 0 : return supportedExtensions.at( 0 ); 231 : : } 232 : : else 233 : : { 234 : : // who knows? provider says it has no file support at all... 235 : 0 : return QStringLiteral( "tif" ); 236 : : } 237 : 0 : } 238 : : 239 : 0 : bool QgsProcessingProvider::supportsNonFileBasedOutput() const 240 : : { 241 : 0 : return true; 242 : : }