00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
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
00040
00041 enum FeatureFlags { FeatIsSelected = 1, FeatDrawMarkers = 2 };
00042
00043
00044 struct FeatureToRender
00045 {
00046 FeatureToRender( QgsFeature& _f, int _flags ) : feat( _f ), flags( _flags ) {}
00047 QgsFeature feat;
00048 int flags;
00049 };
00050
00051
00052
00053 struct RenderJob
00054 {
00055 RenderJob( FeatureToRender& _ftr, QgsSymbolV2* _s ) : ftr( _ftr ), symbol( _s ) {}
00056 FeatureToRender& ftr;
00057 QgsSymbolV2* symbol;
00058 };
00059
00060
00061
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
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
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
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;
00167 QgsSymbolV2* mSymbol;
00168 int mScaleMinDenom, mScaleMaxDenom;
00169 QString mFilterExp, mLabel, mDescription;
00170 bool mElseRule;
00171 RuleList mChildren;
00172
00173
00174 QgsExpression* mFilter;
00175
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
00256 RenderQueue mRenderQueue;
00257 QList<FeatureToRender> mCurrentFeatures;
00258 };
00259
00260 #endif // QGSRULEBASEDRENDERERV2_H