Quantum GIS API Documentation
1.8
|
00001 /*************************************************************************** 00002 qgsrulebasedrendererv2.h - Rule-based renderer (symbology-ng) 00003 --------------------- 00004 begin : May 2010 00005 copyright : (C) 2010 by Martin Dobias 00006 email : wonder.sk at gmail.com 00007 *************************************************************************** 00008 * * 00009 * This program is free software; you can redistribute it and/or modify * 00010 * it under the terms of the GNU General Public License as published by * 00011 * the Free Software Foundation; either version 2 of the License, or * 00012 * (at your option) any later version. * 00013 * * 00014 ***************************************************************************/ 00015 00016 #ifndef QGSRULEBASEDRENDERERV2_H 00017 #define QGSRULEBASEDRENDERERV2_H 00018 00019 #include "qgsfield.h" 00020 #include "qgsfeature.h" 00021 #include "qgis.h" 00022 00023 #include "qgsrendererv2.h" 00024 00025 class QgsExpression; 00026 00027 class QgsCategorizedSymbolRendererV2; 00028 class QgsGraduatedSymbolRendererV2; 00029 00034 class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2 00035 { 00036 public: 00037 00038 00039 // TODO: use QVarLengthArray instead of QList 00040 00041 enum FeatureFlags { FeatIsSelected = 1, FeatDrawMarkers = 2 }; 00042 00043 // feature for rendering: QgsFeature and some flags 00044 struct FeatureToRender 00045 { 00046 FeatureToRender( QgsFeature& _f, int _flags ) : feat( _f ), flags( _flags ) {} 00047 QgsFeature feat; 00048 int flags; // selected and/or draw markers 00049 }; 00050 00051 // rendering job: a feature to be rendered with a particular symbol 00052 // (both f, symbol are _not_ owned by this class) 00053 struct RenderJob 00054 { 00055 RenderJob( FeatureToRender& _ftr, QgsSymbolV2* _s ) : ftr( _ftr ), symbol( _s ) {} 00056 FeatureToRender& ftr; 00057 QgsSymbolV2* symbol; 00058 }; 00059 00060 // render level: a list of jobs to be drawn at particular level 00061 // (jobs are owned by this class) 00062 struct RenderLevel 00063 { 00064 RenderLevel( int z ): zIndex( z ) {} 00065 ~RenderLevel() { foreach( RenderJob* j, jobs ) delete j; } 00066 int zIndex; 00067 QList<RenderJob*> jobs; 00068 }; 00069 00070 // rendering queue: a list of rendering levels 00071 typedef QList<RenderLevel> RenderQueue; 00072 00073 class Rule; 00074 typedef QList<Rule*> RuleList; 00075 00084 class CORE_EXPORT Rule 00085 { 00086 public: 00088 Rule( QgsSymbolV2* symbol, int scaleMinDenom = 0, int scaleMaxDenom = 0, QString filterExp = QString(), 00089 QString label = QString(), QString description = QString() ); 00090 //Rule( const Rule& other ); 00091 ~Rule(); 00092 QString dump( int offset = 0 ) const; 00093 QSet<QString> usedAttributes(); 00094 QgsSymbolV2List symbols(); 00095 QgsLegendSymbolList legendSymbolItems(); 00096 bool isFilterOK( QgsFeature& f ) const; 00097 bool isScaleOK( double scale ) const; 00098 00099 QgsSymbolV2* symbol() { return mSymbol; } 00100 QString label() const { return mLabel; } 00101 bool dependsOnScale() const { return mScaleMinDenom != 0 || mScaleMaxDenom != 0; } 00102 int scaleMinDenom() const { return mScaleMinDenom; } 00103 int scaleMaxDenom() const { return mScaleMaxDenom; } 00104 QgsExpression* filter() const { return mFilter; } 00105 QString filterExpression() const { return mFilterExp; } 00106 QString description() const { return mDescription; } 00107 00109 void setSymbol( QgsSymbolV2* sym ); 00110 void setLabel( QString label ) { mLabel = label; } 00111 void setScaleMinDenom( int scaleMinDenom ) { mScaleMinDenom = scaleMinDenom; } 00112 void setScaleMaxDenom( int scaleMaxDenom ) { mScaleMaxDenom = scaleMaxDenom; } 00113 void setFilterExpression( QString filterExp ) { mFilterExp = filterExp; initFilter(); } 00114 void setDescription( QString description ) { mDescription = description; } 00115 00116 //Rule& operator=( const Rule& other ); 00118 Rule* clone() const; 00119 00120 void toSld( QDomDocument& doc, QDomElement &element, QgsStringMap props ); 00121 static Rule* createFromSld( QDomElement& element, QGis::GeometryType geomType ); 00122 00123 QDomElement save( QDomDocument& doc, QgsSymbolV2Map& symbolMap ); 00124 00126 bool startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer ); 00128 QSet<int> collectZLevels(); 00130 void setNormZLevels( const QMap<int, int>& zLevelsToNormLevels ); 00131 00132 bool renderFeature( FeatureToRender& featToRender, QgsRenderContext& context, RenderQueue& renderQueue ); 00133 00136 bool willRenderFeature( QgsFeature& feat ); 00137 00140 QgsSymbolV2List symbolsForFeature( QgsFeature& feat ); 00141 00142 void stopRender( QgsRenderContext& context ); 00143 00144 static Rule* create( QDomElement& ruleElem, QgsSymbolV2Map& symbolMap ); 00145 00146 RuleList& children() { return mChildren; } 00147 Rule* parent() { return mParent; } 00148 00150 void appendChild( Rule* rule ) { mChildren.append( rule ); rule->mParent = this; } 00152 void insertChild( int i, Rule* rule ) { mChildren.insert( i, rule ); rule->mParent = this; } 00154 void removeChild( Rule* rule ) { mChildren.removeAll( rule ); delete rule; } 00156 void removeChildAt( int i ) { Rule* rule = mChildren[i]; mChildren.removeAt( i ); delete rule; } 00158 void takeChild( Rule* rule ) { mChildren.removeAll( rule ); rule->mParent = NULL; } 00160 Rule* takeChildAt( int i ) { Rule* rule = mChildren.takeAt( i ); rule->mParent = NULL; return rule; } 00161 00162 protected: 00163 00164 void initFilter(); 00165 00166 Rule* mParent; // parent rule (NULL only for root rule) 00167 QgsSymbolV2* mSymbol; 00168 int mScaleMinDenom, mScaleMaxDenom; 00169 QString mFilterExp, mLabel, mDescription; 00170 bool mElseRule; 00171 RuleList mChildren; 00172 00173 // temporary 00174 QgsExpression* mFilter; 00175 // temporary while rendering 00176 QList<int> mSymbolNormZLevels; 00177 RuleList mActiveChildren; 00178 }; 00179 00181 00182 static QgsFeatureRendererV2* create( QDomElement& element ); 00183 00185 QgsRuleBasedRendererV2( QgsRuleBasedRendererV2::Rule* root ); 00187 QgsRuleBasedRendererV2( QgsSymbolV2* defaultSymbol ); 00188 00189 ~QgsRuleBasedRendererV2(); 00190 00192 virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature ); 00193 00194 virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false ); 00195 00196 virtual void startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer ); 00197 00198 virtual void stopRender( QgsRenderContext& context ); 00199 00200 virtual QList<QString> usedAttributes(); 00201 00202 virtual QgsFeatureRendererV2* clone(); 00203 00204 virtual void toSld( QDomDocument& doc, QDomElement &element ) const; 00205 00206 static QgsFeatureRendererV2* createFromSld( QDomElement& element, QGis::GeometryType geomType ); 00207 00208 virtual QgsSymbolV2List symbols(); 00209 00211 virtual QDomElement save( QDomDocument& doc ); 00212 00214 virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize ); 00215 00218 virtual QgsLegendSymbolList legendSymbolItems(); 00219 00221 virtual QString dump(); 00222 00226 virtual bool willRenderFeature( QgsFeature& feat ); 00227 00232 virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat ); 00233 00236 virtual int capabilities() { return MoreSymbolsPerFeature; } 00237 00239 00240 Rule* rootRule() { return mRootRule; } 00241 00243 00245 static void refineRuleCategories( Rule* initialRule, QgsCategorizedSymbolRendererV2* r ); 00247 static void refineRuleRanges( Rule* initialRule, QgsGraduatedSymbolRendererV2* r ); 00249 static void refineRuleScales( Rule* initialRule, QList<int> scales ); 00250 00251 protected: 00253 Rule* mRootRule; 00254 00255 // temporary 00256 RenderQueue mRenderQueue; 00257 QList<FeatureToRender> mCurrentFeatures; 00258 }; 00259 00260 #endif // QGSRULEBASEDRENDERERV2_H