Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsrasterrendererutils.cpp 3 : : ------------------- 4 : : begin : September 2020 5 : : copyright : (C) 2020 by Nyall Dawson 6 : : email : nyall dawson 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 "qgsrasterrendererutils.h" 19 : : #include "qgis.h" 20 : : #include <QFile> 21 : : #include <QTextStream> 22 : : #include <QRegularExpression> 23 : : 24 : 0 : bool QgsRasterRendererUtils::parseColorMapFile( const QString &path, QList<QgsColorRampShader::ColorRampItem> &items, QgsColorRampShader::Type &type, QStringList &errors ) 25 : : { 26 : 0 : QFile inputFile( path ); 27 : 0 : if ( !inputFile.open( QFile::ReadOnly ) ) 28 : : { 29 : 0 : errors.append( QObject::tr( "Read access denied. Adjust the file permissions and try again.\n\n" ) ); 30 : 0 : return false; 31 : : } 32 : : 33 : 0 : bool res = true; 34 : : 35 : 0 : QTextStream inputStream( &inputFile ); 36 : 0 : int lineCounter = 0; 37 : 0 : const QRegularExpression itemRegex( QStringLiteral( "^(.+?),(.+?),(.+?),(.+?),(.+?),(.+)$" ) ); 38 : : 39 : : //read through the input looking for valid data 40 : 0 : while ( !inputStream.atEnd() ) 41 : : { 42 : 0 : lineCounter++; 43 : 0 : const QString inputLine = inputStream.readLine(); 44 : 0 : if ( !inputLine.isEmpty() ) 45 : : { 46 : 0 : if ( !inputLine.simplified().startsWith( '#' ) ) 47 : : { 48 : 0 : if ( inputLine.contains( QLatin1String( "INTERPOLATION" ), Qt::CaseInsensitive ) ) 49 : : { 50 : 0 : QStringList inputStringComponents = inputLine.split( ':' ); 51 : 0 : if ( inputStringComponents.size() == 2 ) 52 : : { 53 : 0 : if ( inputStringComponents[1].trimmed().toUpper().compare( QLatin1String( "INTERPOLATED" ), Qt::CaseInsensitive ) == 0 ) 54 : : { 55 : 0 : type = QgsColorRampShader::Interpolated; 56 : 0 : } 57 : 0 : else if ( inputStringComponents[1].trimmed().toUpper().compare( QLatin1String( "DISCRETE" ), Qt::CaseInsensitive ) == 0 ) 58 : : { 59 : 0 : type = QgsColorRampShader::Discrete; 60 : 0 : } 61 : : else 62 : : { 63 : 0 : type = QgsColorRampShader::Exact; 64 : : } 65 : 0 : } 66 : : else 67 : : { 68 : 0 : res = false; 69 : 0 : errors << QObject::tr( "Unknown interpolation type at line %1: %2" ).arg( lineCounter ).arg( inputLine ); 70 : : } 71 : 0 : } 72 : : else 73 : : { 74 : 0 : const QRegularExpressionMatch match = itemRegex.match( inputLine ); 75 : 0 : if ( match.hasMatch() ) 76 : : { 77 : 0 : QgsColorRampShader::ColorRampItem currentItem( match.captured( 1 ).toDouble(), 78 : 0 : QColor::fromRgb( match.captured( 2 ).toInt(), match.captured( 3 ).toInt(), match.captured( 4 ).toInt(), match.captured( 5 ).toInt() ), 79 : 0 : match.captured( 6 ) ); 80 : 0 : items.push_back( currentItem ); 81 : 0 : } 82 : : else 83 : : { 84 : 0 : res = false; 85 : 0 : errors << QObject::tr( "Invalid entry at line %1: %2" ).arg( lineCounter ).arg( inputLine ); 86 : : } 87 : 0 : } 88 : 0 : } 89 : 0 : } 90 : 0 : lineCounter++; 91 : 0 : } 92 : : 93 : 0 : return res; 94 : 0 : } 95 : : 96 : 0 : bool QgsRasterRendererUtils::saveColorMapFile( const QString &path, const QList<QgsColorRampShader::ColorRampItem> &items, QgsColorRampShader::Type type ) 97 : : { 98 : 0 : QFile outputFile( path ); 99 : 0 : if ( outputFile.open( QFile::WriteOnly | QIODevice::Truncate ) ) 100 : : { 101 : 0 : QTextStream outputStream( &outputFile ); 102 : 0 : outputStream << "# " << QObject::tr( "QGIS Generated Color Map Export File" ) << '\n'; 103 : 0 : outputStream << "INTERPOLATION:"; 104 : 0 : switch ( type ) 105 : : { 106 : : case QgsColorRampShader::Interpolated: 107 : 0 : outputStream << "INTERPOLATED\n"; 108 : 0 : break; 109 : : case QgsColorRampShader::Discrete: 110 : 0 : outputStream << "DISCRETE\n"; 111 : 0 : break; 112 : : case QgsColorRampShader::Exact: 113 : 0 : outputStream << "EXACT\n"; 114 : 0 : break; 115 : : } 116 : : 117 : 0 : int i = 0; 118 : 0 : for ( const QgsColorRampShader::ColorRampItem &item : items ) 119 : : { 120 : 0 : outputStream << qgsDoubleToString( item.value ) << ','; 121 : 0 : outputStream << item.color.red() << ',' << item.color.green() << ',' << item.color.blue() << ',' << item.color.alpha() << ','; 122 : 0 : if ( item.label.isEmpty() ) 123 : : { 124 : 0 : outputStream << "Color entry " << i + 1 << '\n'; 125 : 0 : } 126 : : else 127 : : { 128 : 0 : outputStream << item.label << '\n'; 129 : : } 130 : 0 : i++; 131 : : } 132 : 0 : outputStream.flush(); 133 : 0 : outputFile.close(); 134 : 0 : return true; 135 : 0 : } 136 : : else 137 : : { 138 : 0 : return false; 139 : : } 140 : 0 : } 141 : :