Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsprocessingparameterdxflayers.cpp 3 : : --------------------- 4 : : Date : September 2020 5 : : Copyright : (C) 2020 by Alexander Bruy 6 : : Email : alexander dot bruy at gmail dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : #include "qgsprocessingparameterdxflayers.h" 17 : : #include "qgsvectorlayer.h" 18 : : 19 : : 20 : 0 : QgsProcessingParameterDxfLayers::QgsProcessingParameterDxfLayers( const QString &name, const QString &description ) 21 : 0 : : QgsProcessingParameterDefinition( name, description, QVariant(), false ) 22 : 0 : { 23 : 0 : } 24 : : 25 : 0 : QgsProcessingParameterDefinition *QgsProcessingParameterDxfLayers::clone() const 26 : : { 27 : 0 : return new QgsProcessingParameterDxfLayers( *this ); 28 : 0 : } 29 : : 30 : 0 : QString QgsProcessingParameterDxfLayers::type() const 31 : : { 32 : 0 : return typeName(); 33 : : } 34 : : 35 : 0 : bool QgsProcessingParameterDxfLayers::checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context ) const 36 : : { 37 : 0 : if ( !input.isValid() ) 38 : 0 : return mFlags & FlagOptional; 39 : : 40 : 0 : if ( qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( input ) ) ) 41 : : { 42 : 0 : return true; 43 : : } 44 : : 45 : 0 : if ( input.type() == QVariant::String ) 46 : : { 47 : 0 : if ( input.toString().isEmpty() ) 48 : 0 : return mFlags & FlagOptional; 49 : : 50 : 0 : if ( !context ) 51 : 0 : return true; 52 : : 53 : 0 : QgsMapLayer *mapLayer = QgsProcessingUtils::mapLayerFromString( input.toString(), *context ); 54 : 0 : return mapLayer && ( mapLayer->type() == QgsMapLayerType::VectorLayer ); 55 : : } 56 : 0 : else if ( input.type() == QVariant::List ) 57 : : { 58 : 0 : if ( input.toList().isEmpty() ) 59 : 0 : return mFlags & FlagOptional;; 60 : : 61 : 0 : const QVariantList layerList = input.toList(); 62 : 0 : for ( const QVariant &variantLayer : layerList ) 63 : : { 64 : 0 : if ( qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( variantLayer ) ) ) 65 : 0 : continue; 66 : : 67 : 0 : if ( variantLayer.type() == QVariant::String ) 68 : : { 69 : 0 : if ( !context ) 70 : 0 : return true; 71 : : 72 : 0 : QgsMapLayer *mapLayer = QgsProcessingUtils::mapLayerFromString( variantLayer.toString(), *context ); 73 : 0 : if ( !mapLayer || mapLayer->type() != QgsMapLayerType::VectorLayer ) 74 : 0 : return false; 75 : 0 : } 76 : 0 : else if ( variantLayer.type() == QVariant::Map ) 77 : : { 78 : 0 : QVariantMap layerMap = variantLayer.toMap(); 79 : : 80 : 0 : if ( !layerMap.contains( QStringLiteral( "layer" ) ) && !layerMap.contains( QStringLiteral( "attributeIndex" ) ) ) 81 : 0 : return false; 82 : : 83 : 0 : if ( !context ) 84 : 0 : return true; 85 : : 86 : 0 : QgsMapLayer *mapLayer = QgsProcessingUtils::mapLayerFromString( layerMap.value( QStringLiteral( "layer" ) ).toString(), *context ); 87 : 0 : if ( !mapLayer || mapLayer->type() != QgsMapLayerType::VectorLayer ) 88 : 0 : return false; 89 : : 90 : 0 : QgsVectorLayer *vectorLayer = static_cast<QgsVectorLayer *>( mapLayer ); 91 : : 92 : 0 : if ( !vectorLayer ) 93 : 0 : return false; 94 : : 95 : 0 : if ( layerMap.value( QStringLiteral( "attributeIndex" ) ).toInt() >= vectorLayer->fields().count() ) 96 : 0 : return false; 97 : 0 : } 98 : : else 99 : : { 100 : 0 : return false; 101 : : } 102 : : } 103 : 0 : return true; 104 : 0 : } 105 : 0 : else if ( input.type() == QVariant::StringList ) 106 : : { 107 : 0 : const auto constToStringList = input.toStringList(); 108 : 0 : if ( constToStringList.isEmpty() ) 109 : 0 : return mFlags & FlagOptional; 110 : : 111 : 0 : if ( !context ) 112 : 0 : return true; 113 : : 114 : 0 : for ( const QString &v : constToStringList ) 115 : : { 116 : 0 : if ( !QgsProcessingUtils::mapLayerFromString( v, *context ) ) 117 : 0 : return false; 118 : : } 119 : 0 : return true; 120 : 0 : } 121 : : 122 : 0 : return false; 123 : 0 : } 124 : : 125 : 0 : QString QgsProcessingParameterDxfLayers::valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const 126 : : { 127 : 0 : QStringList parts; 128 : 0 : const QList<QgsDxfExport::DxfLayer> layers = parameterAsLayers( value, context ); 129 : 0 : for ( const QgsDxfExport::DxfLayer &layer : layers ) 130 : : { 131 : 0 : QStringList layerDefParts; 132 : 0 : layerDefParts << QStringLiteral( "'layer': " ) + QgsProcessingUtils::stringToPythonLiteral( QgsProcessingUtils::normalizeLayerSource( layer.layer()->source() ) ); 133 : 0 : if ( layer.layerOutputAttributeIndex() >= -1 ) 134 : 0 : layerDefParts << QStringLiteral( "'attributeIndex': " ) + QgsProcessingUtils::variantToPythonLiteral( layer.layerOutputAttributeIndex() ); 135 : : 136 : 0 : QString layerDef = QStringLiteral( "{%1}" ).arg( layerDefParts.join( ',' ) ); 137 : 0 : parts << layerDef; 138 : 0 : } 139 : 0 : return parts.join( ',' ).prepend( '[' ).append( ']' ); 140 : 0 : } 141 : : 142 : 0 : QString QgsProcessingParameterDxfLayers::asPythonString( QgsProcessing::PythonOutputType outputType ) const 143 : : { 144 : 0 : switch ( outputType ) 145 : : { 146 : : case QgsProcessing::PythonQgsProcessingAlgorithmSubclass: 147 : : { 148 : 0 : QString code = QStringLiteral( "QgsProcessingParameterDxfLayers('%1', '%2')" ).arg( name(), description() ); 149 : 0 : return code; 150 : 0 : } 151 : : } 152 : 0 : return QString(); 153 : 0 : } 154 : : 155 : 0 : QList<QgsDxfExport::DxfLayer> QgsProcessingParameterDxfLayers::parameterAsLayers( const QVariant &layersVariant, QgsProcessingContext &context ) 156 : : { 157 : 0 : QList<QgsDxfExport::DxfLayer> layers; 158 : : 159 : 0 : if ( QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( layersVariant ) ) ) 160 : : { 161 : 0 : layers << QgsDxfExport::DxfLayer( layer ); 162 : 0 : } 163 : : 164 : 0 : if ( layersVariant.type() == QVariant::String ) 165 : : { 166 : 0 : QgsMapLayer *mapLayer = QgsProcessingUtils::mapLayerFromString( layersVariant.toString(), context ); 167 : 0 : layers << QgsDxfExport::DxfLayer( static_cast<QgsVectorLayer *>( mapLayer ) ); 168 : 0 : } 169 : 0 : else if ( layersVariant.type() == QVariant::List ) 170 : : { 171 : 0 : const QVariantList layersVariantList = layersVariant.toList(); 172 : 0 : for ( const QVariant &layerItem : layersVariantList ) 173 : : { 174 : 0 : if ( layerItem.type() == QVariant::Map ) 175 : : { 176 : 0 : QVariantMap layerVariantMap = layerItem.toMap(); 177 : 0 : layers << variantMapAsLayer( layerVariantMap, context ); 178 : 0 : } 179 : 0 : else if ( layerItem.type() == QVariant::String ) 180 : : { 181 : 0 : QgsMapLayer *mapLayer = QgsProcessingUtils::mapLayerFromString( layerItem.toString(), context ); 182 : 0 : layers << QgsDxfExport::DxfLayer( static_cast<QgsVectorLayer *>( mapLayer ) ); 183 : 0 : } 184 : : } 185 : 0 : } 186 : 0 : else if ( layersVariant.type() == QVariant::StringList ) 187 : : { 188 : 0 : const auto layersStringList = layersVariant.toStringList(); 189 : 0 : for ( const QString &layerItem : layersStringList ) 190 : : { 191 : 0 : QgsMapLayer *mapLayer = QgsProcessingUtils::mapLayerFromString( layerItem, context ); 192 : 0 : layers << QgsDxfExport::DxfLayer( static_cast<QgsVectorLayer *>( mapLayer ) ); 193 : : } 194 : 0 : } 195 : : 196 : 0 : return layers; 197 : 0 : } 198 : : 199 : 0 : QgsDxfExport::DxfLayer QgsProcessingParameterDxfLayers::variantMapAsLayer( const QVariantMap &layerVariantMap, QgsProcessingContext &context ) 200 : : { 201 : 0 : QVariant layerVariant = layerVariantMap[ QStringLiteral( "layer" ) ]; 202 : : 203 : 0 : QgsVectorLayer *inputLayer = nullptr; 204 : 0 : if ( ( inputLayer = qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( layerVariant ) ) ) ) 205 : : { 206 : : // good 207 : 0 : } 208 : 0 : else if ( ( inputLayer = qobject_cast< QgsVectorLayer * >( QgsProcessingUtils::mapLayerFromString( layerVariant.toString(), context ) ) ) ) 209 : : { 210 : : // good 211 : 0 : } 212 : : else 213 : : { 214 : : // bad 215 : : } 216 : : 217 : 0 : QgsDxfExport::DxfLayer dxfLayer( inputLayer, layerVariantMap[ QStringLiteral( "attributeIndex" ) ].toInt() ); 218 : : return dxfLayer; 219 : 0 : } 220 : : 221 : 0 : QVariantMap QgsProcessingParameterDxfLayers::layerAsVariantMap( const QgsDxfExport::DxfLayer &layer ) 222 : : { 223 : 0 : QVariantMap vm; 224 : 0 : if ( !layer.layer() ) 225 : 0 : return vm; 226 : : 227 : 0 : vm[ QStringLiteral( "layer" )] = layer.layer()->id(); 228 : 0 : vm[ QStringLiteral( "attributeIndex" ) ] = layer.layerOutputAttributeIndex(); 229 : 0 : return vm; 230 : 0 : }