Quantum GIS API Documentation  1.8
src/core/symbology-ng/qgsrulebasedrendererv2.h
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines