QGIS API Documentation 3.41.0-Master (af5edcb665c)
Loading...
Searching...
No Matches
qgsstylealgorithms.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsstylealgorithms.cpp
3 ---------------------
4 begin : July 2019
5 copyright : (C) 2019 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 "qgsstylealgorithms.h"
19#include "qgsstyle.h"
20
22
23QgsCombineStylesAlgorithm::QgsCombineStylesAlgorithm() = default;
24
25QgsCombineStylesAlgorithm::~QgsCombineStylesAlgorithm() = default;
26
27void QgsCombineStylesAlgorithm::initAlgorithm( const QVariantMap & )
28{
29 addParameter( new QgsProcessingParameterMultipleLayers( QStringLiteral( "INPUT" ), QObject::tr( "Input databases" ), Qgis::ProcessingSourceType::File ) );
30
31 addParameter( new QgsProcessingParameterFileDestination( QStringLiteral( "OUTPUT" ), QObject::tr( "Output style database" ), QObject::tr( "Style files (*.xml)" ) ) );
32
33 const QStringList options = QStringList()
34 << QObject::tr( "Symbols" )
35 << QObject::tr( "Color ramps" )
36 << QObject::tr( "Text formats" )
37 << QObject::tr( "Label settings" );
38 addParameter( new QgsProcessingParameterEnum( QStringLiteral( "OBJECTS" ), QObject::tr( "Objects to combine" ), options, true, QVariantList() << 0 << 1 << 2 << 3 ) );
39 addOutput( new QgsProcessingOutputNumber( QStringLiteral( "SYMBOLS" ), QObject::tr( "Symbol count" ) ) );
40 addOutput( new QgsProcessingOutputNumber( QStringLiteral( "COLORRAMPS" ), QObject::tr( "Color ramp count" ) ) );
41 addOutput( new QgsProcessingOutputNumber( QStringLiteral( "TEXTFORMATS" ), QObject::tr( "Text format count" ) ) );
42 addOutput( new QgsProcessingOutputNumber( QStringLiteral( "LABELSETTINGS" ), QObject::tr( "Label settings count" ) ) );
43}
44
45QString QgsCombineStylesAlgorithm::name() const
46{
47 return QStringLiteral( "combinestyles" );
48}
49
50QString QgsCombineStylesAlgorithm::displayName() const
51{
52 return QObject::tr( "Combine style databases" );
53}
54
55QStringList QgsCombineStylesAlgorithm::tags() const
56{
57 return QObject::tr( "symbols,colors,ramps,formats,labels,text,fonts,merge" ).split( ',' );
58}
59
60QString QgsCombineStylesAlgorithm::group() const
61{
62 return QObject::tr( "Cartography" );
63}
64
65QString QgsCombineStylesAlgorithm::groupId() const
66{
67 return QStringLiteral( "cartography" );
68}
69
70QString QgsCombineStylesAlgorithm::shortHelpString() const
71{
72 return QObject::tr( "This algorithm combines multiple QGIS style databases into a single style database. If any symbols exist with duplicate names between the different "
73 "source databases these will be renamed to have unique names in the output combined database." );
74}
75
76QString QgsCombineStylesAlgorithm::shortDescription() const
77{
78 return QObject::tr( "Combines multiple style databases into a single database." );
79}
80
81QgsCombineStylesAlgorithm *QgsCombineStylesAlgorithm::createInstance() const
82{
83 return new QgsCombineStylesAlgorithm();
84}
85
86QVariantMap QgsCombineStylesAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
87{
88 const QStringList inputs = parameterAsFileList( parameters, QStringLiteral( "INPUT" ), context );
89
90 QList<QgsStyle::StyleEntity> objects;
91 const QList<int> selectedObjects = parameterAsEnums( parameters, QStringLiteral( "OBJECTS" ), context );
92 if ( selectedObjects.contains( 0 ) )
93 objects << QgsStyle::SymbolEntity;
94 if ( selectedObjects.contains( 1 ) )
96 if ( selectedObjects.contains( 2 ) )
98 if ( selectedObjects.contains( 3 ) )
100
101 QgsStyle style;
102 style.createMemoryDatabase();
103
104 int i = 0;
105 QMap<QgsStyle::StyleEntity, QSet<QString>> usedNames;
106 auto makeUniqueName = [&usedNames]( const QString &sourceName, QgsStyle::StyleEntity type ) -> QString {
107 QString candidate = sourceName;
108 int i = 1;
109 bool exists = true;
110 while ( exists )
111 {
112 exists = usedNames[type].contains( candidate );
113 if ( !exists )
114 break;
115
116 i++;
117 candidate = sourceName + QStringLiteral( " (%1)" ).arg( i );
118 }
119
120 usedNames[type].insert( candidate );
121 return candidate;
122 };
123
124 for ( const QString &source : inputs )
125 {
126 if ( feedback )
127 {
128 feedback->setProgress( 100 * i / static_cast<double>( inputs.count() ) );
129 feedback->pushInfo( QObject::tr( "Importing %1" ).arg( source ) );
130 }
131
132 QgsStyle sourceStyle;
133 sourceStyle.createMemoryDatabase();
134 if ( !sourceStyle.importXml( source ) )
135 {
136 feedback->reportError( QObject::tr( "Could not read %1" ).arg( source ) );
137 i++;
138 continue;
139 }
140
141 if ( objects.contains( QgsStyle::SymbolEntity ) )
142 {
143 const QStringList symbolNames = sourceStyle.symbolNames();
144 for ( const QString &name : symbolNames )
145 {
146 const QString newName = makeUniqueName( name, QgsStyle::SymbolEntity );
147 style.addSymbol( newName, sourceStyle.symbol( name ), true );
148 style.tagSymbol( QgsStyle::SymbolEntity, newName, sourceStyle.tagsOfSymbol( QgsStyle::SymbolEntity, name ) );
149 }
150 }
151 if ( objects.contains( QgsStyle::ColorrampEntity ) )
152 {
153 const QStringList colorRampNames = sourceStyle.colorRampNames();
154 for ( const QString &name : colorRampNames )
155 {
156 const QString newName = makeUniqueName( name, QgsStyle::ColorrampEntity );
157 style.addColorRamp( newName, sourceStyle.colorRamp( name ), true );
158 style.tagSymbol( QgsStyle::ColorrampEntity, newName, sourceStyle.tagsOfSymbol( QgsStyle::ColorrampEntity, name ) );
159 }
160 }
161 if ( objects.contains( QgsStyle::TextFormatEntity ) )
162 {
163 const QStringList formatNames = sourceStyle.textFormatNames();
164 for ( const QString &name : formatNames )
165 {
166 const QString newName = makeUniqueName( name, QgsStyle::TextFormatEntity );
167 style.addTextFormat( newName, sourceStyle.textFormat( name ), true );
168 style.tagSymbol( QgsStyle::TextFormatEntity, newName, sourceStyle.tagsOfSymbol( QgsStyle::TextFormatEntity, name ) );
169 }
170 }
171 if ( objects.contains( QgsStyle::LabelSettingsEntity ) )
172 {
173 const QStringList formatNames = sourceStyle.labelSettingsNames();
174 for ( const QString &name : formatNames )
175 {
176 const QString newName = makeUniqueName( name, QgsStyle::LabelSettingsEntity );
177 style.addLabelSettings( newName, sourceStyle.labelSettings( name ), true );
179 }
180 }
181
182 i++;
183 }
184 if ( feedback )
185 {
186 feedback->setProgress( 100 );
187 feedback->pushInfo( QObject::tr( "Writing output file" ) );
188 }
189
190 const QString file = parameterAsString( parameters, QStringLiteral( "OUTPUT" ), context );
191 if ( !style.exportXml( file ) )
192 {
193 throw QgsProcessingException( QObject::tr( "Error saving style database as %1" ).arg( file ) );
194 }
195
196 QVariantMap results;
197 results.insert( QStringLiteral( "OUTPUT" ), file );
198 results.insert( QStringLiteral( "SYMBOLS" ), style.symbolCount() );
199 results.insert( QStringLiteral( "COLORRAMPS" ), style.colorRampCount() );
200 results.insert( QStringLiteral( "TEXTFORMATS" ), style.textFormatCount() );
201 results.insert( QStringLiteral( "LABELSETTINGS" ), style.labelSettingsCount() );
202 return results;
203}
204
@ File
Files (i.e. non map layer sources, such as text files)
void setProgress(double progress)
Sets the current progress for the feedback object.
Definition qgsfeedback.h:61
Contains information about the context in which a processing algorithm is executed.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
virtual void pushInfo(const QString &info)
Pushes a general informational message from the algorithm.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
A numeric output for processing algorithms.
An enum based parameter for processing algorithms, allowing for selection from predefined values.
A generic file based destination parameter, for specifying the destination path for a file (non-map l...
A parameter for processing algorithms which accepts multiple map layers.
int colorRampCount()
Returns count of color ramps.
Definition qgsstyle.cpp:506
QgsTextFormat textFormat(const QString &name) const
Returns the text format with the specified name.
bool tagSymbol(StyleEntity type, const QString &symbol, const QStringList &tags)
Tags the symbol with the tags in the list.
QStringList textFormatNames() const
Returns a list of names of text formats in the style.
bool addColorRamp(const QString &name, QgsColorRamp *colorRamp, bool update=false)
Adds a color ramp to the style.
Definition qgsstyle.cpp:346
QgsSymbol * symbol(const QString &name)
Returns a NEW copy of symbol.
Definition qgsstyle.cpp:318
int labelSettingsCount() const
Returns count of label settings in the style.
StyleEntity
Enum for Entities involved in a style.
Definition qgsstyle.h:203
@ LabelSettingsEntity
Label settings.
Definition qgsstyle.h:209
@ TextFormatEntity
Text formats.
Definition qgsstyle.h:208
@ SymbolEntity
Symbols.
Definition qgsstyle.h:204
@ ColorrampEntity
Color ramps.
Definition qgsstyle.h:206
QStringList tagsOfSymbol(StyleEntity type, const QString &symbol)
Returns the tags associated with the symbol.
QStringList colorRampNames() const
Returns a list of names of color ramps.
Definition qgsstyle.cpp:511
int textFormatCount() const
Returns count of text formats in the style.
bool exportXml(const QString &filename)
Exports the style as a XML file.
QgsColorRamp * colorRamp(const QString &name) const
Returns a new copy of the specified color ramp.
Definition qgsstyle.cpp:495
int symbolCount()
Returns count of symbols in style.
Definition qgsstyle.cpp:335
bool createMemoryDatabase()
Creates a temporary memory database.
Definition qgsstyle.cpp:564
QStringList labelSettingsNames() const
Returns a list of names of label settings in the style.
bool addTextFormat(const QString &name, const QgsTextFormat &format, bool update=false)
Adds a text format with the specified name to the style.
Definition qgsstyle.cpp:370
QgsPalLayerSettings labelSettings(const QString &name) const
Returns the label settings with the specified name.
bool addSymbol(const QString &name, QgsSymbol *symbol, bool update=false)
Adds a symbol to style and takes symbol's ownership.
Definition qgsstyle.cpp:224
QStringList symbolNames() const
Returns a list of names of symbols.
Definition qgsstyle.cpp:340
bool importXml(const QString &filename)
Imports the symbols and colorramps into the default style database from the given XML file.
bool addLabelSettings(const QString &name, const QgsPalLayerSettings &settings, bool update=false)
Adds label settings with the specified name to the style.
Definition qgsstyle.cpp:391