Skip to content

Commit fd7e03d

Browse files
committed
Merge branch 'master' of github.com:qgis/Quantum-GIS
2 parents 32be114 + ad955e2 commit fd7e03d

File tree

10 files changed

+352
-118
lines changed

10 files changed

+352
-118
lines changed

python/core/symbology-ng-core.sip

Lines changed: 108 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@ public:
7777

7878
virtual QString dump();
7979

80+
enum Capabilities
81+
{
82+
SymbolLevels = 1, // rendering with symbol levels (i.e. implements symbols(), symbolForFeature())
83+
RotationField = 2, // rotate symbols by attribute value
84+
MoreSymbolsPerFeature = 4 // may use more than one symbol to render a feature: symbolsForFeature() will return them
85+
};
86+
87+
//! returns bitwise OR-ed capabilities of the renderer
88+
//! \note added in 2.0
89+
virtual int capabilities();
90+
8091
virtual QgsFeatureRendererV2* clone()=0 /Factory/;
8192

8293
virtual QgsSymbolV2List symbols()=0;
@@ -105,6 +116,18 @@ public:
105116
//! @note added in 1.9
106117
virtual void setRotationField( QString fieldName );
107118

119+
//! return whether the renderer will render a feature or not.
120+
//! Must be called between startRender() and stopRender() calls.
121+
//! Default implementation uses symbolForFeature().
122+
//! @note added in 1.9
123+
virtual bool willRenderFeature( QgsFeature& feat );
124+
125+
//! return list of symbols used for rendering the feature.
126+
//! For renderers that do not support MoreSymbolsPerFeature it is more efficient
127+
//! to use symbolForFeature()
128+
//! @note added in 1.9
129+
virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat );
130+
108131
protected:
109132
QgsFeatureRendererV2(QString type);
110133

@@ -154,6 +177,10 @@ public:
154177

155178
virtual QString dump();
156179

180+
//! returns bitwise OR-ed capabilities of the renderer
181+
//! \note added in 2.0
182+
virtual int capabilities();
183+
157184
virtual QgsFeatureRendererV2* clone() /Factory/;
158185

159186
virtual QgsSymbolV2List symbols();
@@ -221,6 +248,10 @@ public:
221248

222249
virtual QString dump();
223250

251+
//! returns bitwise OR-ed capabilities of the renderer
252+
//! \note added in 2.0
253+
virtual int capabilities();
254+
224255
virtual QgsFeatureRendererV2* clone() /Factory/;
225256

226257
virtual QgsSymbolV2List symbols();
@@ -320,6 +351,10 @@ public:
320351

321352
virtual QString dump();
322353

354+
//! returns bitwise OR-ed capabilities of the renderer
355+
//! \note added in 2.0
356+
virtual int capabilities();
357+
323358
virtual QgsFeatureRendererV2* clone() /Factory/;
324359

325360
virtual QgsSymbolV2List symbols();
@@ -410,27 +445,76 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2
410445
class Rule
411446
{
412447
public:
413-
//! Constructor takes ownership of the symbol
414-
Rule( QgsSymbolV2* symbol /Transfer/, int scaleMinDenom = 0, int scaleMaxDenom = 0, QString filterExp = QString() );
415-
//Rule( const QgsRuleBasedRendererV2::Rule& other );
448+
449+
Rule( QgsSymbolV2* symbol /Transfer/, int scaleMinDenom = 0, int scaleMaxDenom = 0, QString filterExp = QString(),
450+
QString label = QString(), QString description = QString() );
416451
~Rule();
417-
QString dump() const;
418-
//QStringList needsFields() const;
452+
QString dump( int offset = 0 ) const;
453+
QSet<QString> usedAttributes();
454+
QgsSymbolV2List symbols();
455+
// TODO QgsLegendSymbolList legendSymbolItems();
419456
bool isFilterOK( QgsFeature& f ) const;
420457
bool isScaleOK( double scale ) const;
421458

422459
QgsSymbolV2* symbol();
460+
QString label() const;
423461
bool dependsOnScale() const;
424462
int scaleMinDenom() const;
425463
int scaleMaxDenom() const;
426-
QString filterExpression() const;
427464
QgsExpression* filter() const;
465+
QString filterExpression() const;
466+
QString description() const;
428467

468+
//! set a new symbol (or NULL). Deletes old symbol.
469+
void setSymbol( QgsSymbolV2* sym /Transfer/ );
470+
void setLabel( QString label );
429471
void setScaleMinDenom( int scaleMinDenom );
430472
void setScaleMaxDenom( int scaleMaxDenom );
431473
void setFilterExpression( QString filterExp );
474+
void setDescription( QString description );
475+
476+
//! clone this rule, return new instance
477+
QgsRuleBasedRendererV2::Rule* clone() const /Factory/;
478+
479+
QDomElement save( QDomDocument& doc, QgsSymbolV2Map& symbolMap );
480+
481+
//! prepare the rule for rendering and its children (build active children array)
482+
bool startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer );
483+
//! get all used z-levels from this rule and children
484+
QSet<int> collectZLevels();
485+
//! assign normalized z-levels [0..N-1] for this rule's symbol for quick access during rendering
486+
// TODO void setNormZLevels( const QMap<int, int>& zLevelsToNormLevels );
487+
488+
// TODO bool renderFeature( FeatureToRender& featToRender, QgsRenderContext& context, RenderQueue& renderQueue );
489+
490+
//! only tell whether a feature will be rendered without actually rendering it
491+
//! @note added in 1.9
492+
bool willRenderFeature( QgsFeature& feat );
493+
494+
//! tell which symbols will be used to render the feature
495+
//! @note added in 1.9
496+
QgsSymbolV2List symbolsForFeature( QgsFeature& feat );
497+
498+
void stopRender( QgsRenderContext& context );
499+
500+
static QgsRuleBasedRendererV2::Rule* create( QDomElement& ruleElem, QgsSymbolV2Map& symbolMap ) /Factory/;
501+
502+
QList<QgsRuleBasedRendererV2::Rule*>& children();
503+
QgsRuleBasedRendererV2::Rule* parent();
504+
505+
//! add child rule, take ownership, sets this as parent
506+
void appendChild( QgsRuleBasedRendererV2::Rule* rule /Transfer/ );
507+
//! add child rule, take ownership, sets this as parent
508+
void insertChild( int i, QgsRuleBasedRendererV2::Rule* rule /Transfer/ );
509+
//! delete child rule
510+
void removeChild( QgsRuleBasedRendererV2::Rule* rule );
511+
//! delete child rule
512+
void removeChildAt( int i );
513+
//! take child rule out, set parent as null
514+
void takeChild( QgsRuleBasedRendererV2::Rule* rule );
515+
//! take child rule out, set parent as null
516+
QgsRuleBasedRendererV2::Rule* takeChildAt( int i );
432517

433-
//Rule& operator=( const Rule& other );
434518
};
435519

436520
/////
@@ -453,6 +537,12 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2
453537

454538
virtual QList<QString> usedAttributes();
455539

540+
virtual QString dump();
541+
542+
//! returns bitwise OR-ed capabilities of the renderer
543+
//! \note added in 2.0
544+
virtual int capabilities();
545+
456546
virtual QgsFeatureRendererV2* clone() /Factory/;
457547

458548
virtual QgsSymbolV2List symbols();
@@ -463,6 +553,17 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2
463553
//! return a list of symbology items for the legend
464554
virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize );
465555

556+
//! return whether the renderer will render a feature or not.
557+
//! Must be called between startRender() and stopRender() calls.
558+
//! @note added in 1.9
559+
virtual bool willRenderFeature( QgsFeature& feat );
560+
561+
//! return list of symbols used for rendering the feature.
562+
//! For renderers that do not support MoreSymbolsPerFeature it is more efficient
563+
//! to use symbolForFeature()
564+
//! @note added in 1.9
565+
virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat );
566+
466567
/////
467568

468569

python/plugins/fTools/tools/doGeometry.py

Lines changed: 29 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -508,44 +508,48 @@ def lines_to_polygons( self ):
508508
return True
509509

510510
def export_geometry_info( self ):
511+
ellips = None
512+
crs = None
513+
coordTransform = None
514+
515+
# calculate with:
516+
# 0 - layer CRS
517+
# 1 - project CRS
518+
# 2 - ellipsoidal
519+
if self.myCalcType == 2:
520+
settings = QSettings()
521+
ellips = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString()
522+
crs = self.vlayer.crs().srsid()
523+
elif self.myCalcType == 1:
524+
mapCRS = self.parent.iface.mapCanvas().mapRenderer().destinationCrs()
525+
layCRS = self.vlayer.crs()
526+
coordTransform = QgsCoordinateTransform( layCRS, mapCRS )
527+
528+
inFeat = QgsFeature()
529+
outFeat = QgsFeature()
530+
inGeom = QgsGeometry()
531+
nElement = 0
532+
533+
vprovider = self.vlayer.dataProvider()
534+
535+
self.emit( SIGNAL( "runStatus( PyQt_PyObject )" ), 0)
536+
self.emit( SIGNAL( "runRange( PyQt_PyObject )" ), ( 0, vprovider.featureCount() ) )
537+
511538
if self.writeShape:
512-
vprovider = self.vlayer.dataProvider()
513539
allAttrs = vprovider.attributeIndexes()
514540
vprovider.select( allAttrs )
515541
( fields, index1, index2 ) = self.checkGeometryFields( self.vlayer )
516542
writer = QgsVectorFileWriter( self.myName, self.myEncoding, fields,
517543
vprovider.geometryType(), vprovider.crs() )
518-
inFeat = QgsFeature()
519-
outFeat = QgsFeature()
520-
inGeom = QgsGeometry()
521-
nFeat = vprovider.featureCount()
522-
nElement = 0
523-
524-
# calculate with:
525-
# 0 - layer CRS
526-
# 1 - project CRS
527-
# 2 - ellipsoidal
528-
ellips = None
529-
crs = None
530-
coordTransform = None
531-
if self.myCalcType == 2:
532-
settings = QSettings()
533-
ellips = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString()
534-
crs = self.parent.iface.mapCanvas().mapRenderer().destinationCrs().srsid()
535-
elif self.myCalcType == 1:
536-
mapCRS = self.parent.iface.mapCanvas().mapRenderer().destinationCrs()
537-
layCRS = self.vlayer.crs()
538-
coordTransform = QgsCoordinateTransform( layCRS, mapCRS )
539-
540-
self.emit( SIGNAL( "runStatus( PyQt_PyObject )" ), 0)
541-
self.emit( SIGNAL( "runRange( PyQt_PyObject )" ), ( 0, nFeat ) )
544+
542545
while vprovider.nextFeature(inFeat):
543546
self.emit( SIGNAL( "runStatus( PyQt_PyObject )" ), nElement )
544547
nElement += 1
545548
inGeom = inFeat.geometry()
546549

547550
if self.myCalcType == 1:
548551
inGeom.transform( coordTransform )
552+
549553
( attr1, attr2 ) = self.simpleMeasure( inGeom, self.myCalcType, ellips, crs )
550554

551555
outFeat.setGeometry( inGeom )
@@ -558,34 +562,9 @@ def export_geometry_info( self ):
558562
return True
559563
else: # update existing file
560564
newFields = []
561-
vprovider = self.vlayer.dataProvider()
562565
geomType = self.vlayer.geometryType()
563566
( index1, index2 ) = self.findOrCreateFields()
564567

565-
inFeat = QgsFeature()
566-
inGeom = QgsGeometry()
567-
nFeat = vprovider.featureCount()
568-
nElement = 0
569-
570-
# calculate with:
571-
# 0 - layer CRS
572-
# 1 - project CRS
573-
# 2 - ellipsoidal
574-
ellips = None
575-
crs = None
576-
coordTransform = None
577-
if self.myCalcType == 2:
578-
settings = QSettings()
579-
ellips = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString()
580-
crs = self.parent.iface.mapCanvas().mapRenderer().destinationCrs().srsid()
581-
elif self.myCalcType == 1:
582-
mapCRS = self.parent.iface.mapCanvas().mapRenderer().destinationCrs()
583-
layCRS = self.vlayer.crs()
584-
coordTransform = QgsCoordinateTransform( layCRS, mapCRS )
585-
586-
self.emit( SIGNAL( "runStatus( PyQt_PyObject )" ), 0)
587-
self.emit( SIGNAL( "runRange( PyQt_PyObject )" ), ( 0, nFeat ) )
588-
589568
while vprovider.nextFeature(inFeat):
590569
self.emit( SIGNAL( "runStatus( PyQt_PyObject )" ), nElement )
591570
nElement += 1

src/app/qgisapp.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,7 +1018,10 @@ void QgisApp::createActionGroups()
10181018
mMapToolGroup->addAction( mActionMeasureAngle );
10191019
mMapToolGroup->addAction( mActionAddFeature );
10201020
mMapToolGroup->addAction( mActionMoveFeature );
1021+
#if defined(GEOS_VERSION_MAJOR) && defined(GEOS_VERSION_MINOR) && \
1022+
((GEOS_VERSION_MAJOR>3) || ((GEOS_VERSION_MAJOR==3) && (GEOS_VERSION_MINOR>=3)))
10211023
mMapToolGroup->addAction( mActionOffsetCurve );
1024+
#endif
10221025
mMapToolGroup->addAction( mActionReshapeFeatures );
10231026
mMapToolGroup->addAction( mActionSplitFeatures );
10241027
mMapToolGroup->addAction( mActionDeleteSelected );
@@ -1667,8 +1670,15 @@ void QgisApp::createCanvasTools()
16671670
mMapTools.mAddFeature->setAction( mActionAddFeature );
16681671
mMapTools.mMoveFeature = new QgsMapToolMoveFeature( mMapCanvas );
16691672
mMapTools.mMoveFeature->setAction( mActionMoveFeature );
1673+
//need at least geos 3.3 for OffsetCurve tool
1674+
#if defined(GEOS_VERSION_MAJOR) && defined(GEOS_VERSION_MINOR) && \
1675+
((GEOS_VERSION_MAJOR>3) || ((GEOS_VERSION_MAJOR==3) && (GEOS_VERSION_MINOR>=3)))
16701676
mMapTools.mOffsetCurve = new QgsMapToolOffsetCurve( mMapCanvas );
16711677
mMapTools.mOffsetCurve->setAction( mActionOffsetCurve );
1678+
#else
1679+
mAdvancedDigitizeToolBar->removeAction( mActionOffsetCurve );
1680+
mEditMenu->removeAction( mActionOffsetCurve );
1681+
#endif //GEOS_VERSION
16721682
mMapTools.mReshapeFeatures = new QgsMapToolReshape( mMapCanvas );
16731683
mMapTools.mReshapeFeatures->setAction( mActionReshapeFeatures );
16741684
mMapTools.mSplitFeatures = new QgsMapToolSplitFeatures( mMapCanvas );

src/app/qgsmaptooloffsetcurve.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,16 @@ void QgsMapToolOffsetCurve::setOffsetForRubberBand( double offset, bool leftSide
352352
int joinStyle = s.value( "/qgis/digitizing/offset_join_style", 0 ).toInt();
353353
int quadSegments = s.value( "/qgis/digitizing/offset_quad_seg", 8 ).toInt();
354354
double mitreLimit = s.value( "/qgis/digitizine/offset_miter_limit", 5.0 ).toDouble();
355-
GEOSGeometry* offsetGeom = GEOSSingleSidedBuffer( geosGeom, offset, quadSegments, joinStyle, mitreLimit, leftSide ? 1 : 0 );
355+
356+
GEOSGeometry* offsetGeom = 0;
357+
//need at least geos 3.3 for OffsetCurve tool
358+
#if defined(GEOS_VERSION_MAJOR) && defined(GEOS_VERSION_MINOR) && \
359+
((GEOS_VERSION_MAJOR>3) || ((GEOS_VERSION_MAJOR==3) && (GEOS_VERSION_MINOR>=3)))
360+
GEOSGeometry* offsetGeom = GEOSOffsetCurve( geosGeom, ( leftSide > 0 ) ? offset : -offset, quadSegments, joinStyle, mitreLimit );
361+
#else
362+
return;
363+
#endif //GEOS_VERSION
364+
356365
if ( !offsetGeom )
357366
{
358367
deleteRubberBandAndGeometry();
@@ -365,9 +374,6 @@ void QgsMapToolOffsetCurve::setOffsetForRubberBand( double offset, bool leftSide
365374
return;
366375
}
367376

368-
//GEOS >= 3.3
369-
//GEOSGeometry* offsetGeom = GEOSOffsetCurve( geosGeom, (leftSide > 0) ? offset : -offset, quadSegments, joinStyle, mitreLimit );
370-
371377
if ( offsetGeom )
372378
{
373379
mModifiedGeometry.fromGeos( offsetGeom );

src/core/symbology-ng/qgsrendererv2.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,3 +417,11 @@ void QgsFeatureRendererV2::renderVertexMarkerPolygon( QPolygonF& pts, QList<QPol
417417
}
418418
}
419419
}
420+
421+
QgsSymbolV2List QgsFeatureRendererV2::symbolsForFeature( QgsFeature& feat )
422+
{
423+
QgsSymbolV2List lst;
424+
QgsSymbolV2* s = symbolForFeature( feat );
425+
if ( s ) lst.append( s );
426+
return lst;
427+
}

src/core/symbology-ng/qgsrendererv2.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ class CORE_EXPORT QgsFeatureRendererV2
8181
enum Capabilities
8282
{
8383
SymbolLevels = 1, // rendering with symbol levels (i.e. implements symbols(), symbolForFeature())
84-
RotationField = 1 << 1 // rotate symbols by attribute value
84+
RotationField = 1 << 1, // rotate symbols by attribute value
85+
MoreSymbolsPerFeature = 1 << 2 // may use more than one symbol to render a feature: symbolsForFeature() will return them
8586
};
8687

8788
//! returns bitwise OR-ed capabilities of the renderer
@@ -117,7 +118,17 @@ class CORE_EXPORT QgsFeatureRendererV2
117118
//! @note added in 1.9
118119
virtual void setRotationField( QString fieldName ) { Q_UNUSED( fieldName ); }
119120

121+
//! return whether the renderer will render a feature or not.
122+
//! Must be called between startRender() and stopRender() calls.
123+
//! Default implementation uses symbolForFeature().
124+
//! @note added in 1.9
125+
virtual bool willRenderFeature( QgsFeature& feat ) { return symbolForFeature( feat ) != NULL; }
120126

127+
//! return list of symbols used for rendering the feature.
128+
//! For renderers that do not support MoreSymbolsPerFeature it is more efficient
129+
//! to use symbolForFeature()
130+
//! @note added in 1.9
131+
virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat );
121132

122133
protected:
123134
QgsFeatureRendererV2( QString type );

0 commit comments

Comments
 (0)