Skip to content

Commit 53790ad

Browse files
committed
Merge pull request #343 from homann/qgsexpression_DA
Settings for measurements ellipsoid moved, fix for #3296 and #4252.
2 parents e7995cf + 69308d3 commit 53790ad

24 files changed

+420
-289
lines changed

python/core/qgsexpression.sip

+4
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ class QgsExpression
6161
//! (used by internal functions)
6262
QgsDistanceArea* geomCalculator();
6363

64+
//! Sets the geometry calculator used in evaluation of expressions,
65+
// instead of the default.
66+
void setGeomCalculator( QgsDistanceArea& calc );
67+
6468
/** This function currently replaces each expression between [% and %]
6569
in the string with the result of its evaluation on the feature
6670
passed as argument.

python/gui/qgsexpressionbuilderdialog.sip

+5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ class QgsExpressionBuilderDialog : QDialog
1717

1818
QString expressionText();
1919

20+
/** Sets geometry calculator used in distance/area calculations.
21+
* @note added in version 2.0
22+
*/
23+
void setGeomCalculator( const QgsDistanceArea & da );
24+
2025
protected:
2126
/**
2227
* Handle closing of the window

python/gui/qgsexpressionbuilderwidget.sip

+5
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ class QgsExpressionBuilderWidget : QWidget
8484

8585
void loadFieldNames( QMap<int, QgsField> fields );
8686

87+
/** Sets geometry calculator used in distance/area calculations.
88+
* @note added in version 2.0
89+
*/
90+
void setGeomCalculator( const QgsDistanceArea & da );
91+
8792
/** Gets the expression string that has been set in the expression area.
8893
* @returns The expression as a string. */
8994
QString expressionText();

src/app/qgsattributeactiondialog.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ back to QgsVectorLayer.
2323
#include "qgsattributeactiondialog.h"
2424
#include "qgsattributeaction.h"
2525
#include "qgsexpressionbuilderdialog.h"
26+
#include "qgisapp.h"
27+
#include "qgsproject.h"
28+
#include "qgsmapcanvas.h"
2629

2730
#include <QFileDialog>
2831
#include <QHeaderView>
@@ -173,6 +176,13 @@ void QgsAttributeActionDialog::insertExpression()
173176
// display the expression builder
174177
QgsExpressionBuilderDialog dlg( mActions->layer(), selText, this );
175178
dlg.setWindowTitle( tr( "Insert expression" ) );
179+
180+
QgsDistanceArea myDa;
181+
myDa.setSourceCrs( mActions->layer()->crs().srsid() );
182+
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() );
183+
myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) );
184+
dlg.setGeomCalculator( myDa );
185+
176186
if ( dlg.exec() == QDialog::Accepted )
177187
{
178188
QString expression = dlg.expressionBuilder()->expressionText();

src/app/qgsattributedialog.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
#include "qgsattributedialog.h"
1818
#include "qgsfield.h"
1919
#include "qgslogger.h"
20-
20+
#include "qgsmapcanvas.h"
21+
#include "qgsproject.h"
2122
#include "qgsvectorlayer.h"
2223
#include "qgsvectordataprovider.h"
2324
#include "qgsuniquevaluerenderer.h"
@@ -218,6 +219,13 @@ QgsAttributeDialog::QgsAttributeDialog( QgsVectorLayer *vl, QgsFeature *thepFeat
218219
}
219220
else
220221
{
222+
223+
QgsDistanceArea myDa;
224+
225+
myDa.setSourceCrs( vl->crs().srsid() );
226+
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() );
227+
myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) );
228+
221229
for ( QgsFieldMap::const_iterator it = theFieldMap.begin(); it != theFieldMap.end(); ++it )
222230
{
223231
QList<QWidget *> myWidgets = mDialog->findChildren<QWidget*>( it->name() );
@@ -258,6 +266,8 @@ QgsAttributeDialog::QgsAttributeDialog( QgsVectorLayer *vl, QgsFeature *thepFeat
258266
}
259267
}
260268

269+
exp.setGeomCalculator( myDa );
270+
261271
QVariant value = exp.evaluate( mFeature, vl->pendingFields() );
262272

263273
if ( !exp.hasEvalError() )

src/app/qgsattributetabledialog.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "qgssearchquerybuilder.h"
3333
#include "qgslogger.h"
3434
#include "qgsmapcanvas.h"
35+
#include "qgsproject.h"
3536
#include "qgsfieldcalculator.h"
3637
#include "qgsfeatureaction.h"
3738
#include "qgsattributeaction.h"
@@ -536,6 +537,13 @@ void QgsAttributeTableDialog::updateSelectionFromLayer()
536537

537538
void QgsAttributeTableDialog::doSearch( QString searchString )
538539
{
540+
541+
QgsDistanceArea myDa;
542+
543+
myDa.setSourceCrs( mLayer->crs().srsid() );
544+
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() );
545+
myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) );
546+
539547
// parse search string and build parsed tree
540548
QgsExpression search( searchString );
541549
if ( search.hasParserError() )
@@ -556,6 +564,7 @@ void QgsAttributeTableDialog::doSearch( QString searchString )
556564
QApplication::setOverrideCursor( Qt::WaitCursor );
557565
mSelectedFeatures.clear();
558566

567+
search.setGeomCalculator( myDa );
559568
if ( cbxSearchSelectedOnly->isChecked() )
560569
{
561570
QgsFeatureList selectedFeatures = mLayer->selectedFeatures();

src/app/qgsfieldcalculator.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@
1313
* *
1414
***************************************************************************/
1515

16+
#include "qgisapp.h"
1617
#include "qgsfieldcalculator.h"
18+
#include "qgsdistancearea.h"
1719
#include "qgsexpression.h"
20+
#include "qgsmapcanvas.h"
21+
#include "qgsproject.h"
1822
#include "qgsvectordataprovider.h"
1923
#include "qgsvectorlayer.h"
2024

2125
#include <QMessageBox>
26+
#include <QSettings>
2227

2328
QgsFieldCalculator::QgsFieldCalculator( QgsVectorLayer* vl )
2429
: QDialog()
@@ -78,6 +83,15 @@ QgsFieldCalculator::~QgsFieldCalculator()
7883

7984
void QgsFieldCalculator::accept()
8085
{
86+
87+
// Set up QgsDistanceArea each time we (re-)calculate
88+
QgsDistanceArea myDa;
89+
90+
myDa.setSourceCrs( mVectorLayer->crs().srsid() );
91+
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() );
92+
myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) );
93+
94+
8195
QString calcString = builder->expressionText();
8296
QgsExpression exp( calcString );
8397

@@ -163,6 +177,7 @@ void QgsFieldCalculator::accept()
163177
}
164178

165179
exp.setCurrentRowNumber( rownum );
180+
exp.setGeomCalculator( myDa );
166181

167182
QVariant value = exp.evaluate( &feature );
168183
if ( exp.hasEvalError() )

src/app/qgslabelinggui.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
#include "qgslabelengineconfigdialog.h"
2626
#include "qgsexpressionbuilderdialog.h"
2727
#include "qgsexpression.h"
28-
#include "qgsmapcanvas.h"
28+
#include "qgisapp.h"
29+
#include "qgsproject.h"
2930
#include "qgscharacterselectdialog.h"
3031

3132
#include <QColorDialog>
@@ -901,6 +902,13 @@ void QgsLabelingGui::showExpressionDialog()
901902
{
902903
QgsExpressionBuilderDialog dlg( mLayer, cboFieldName->currentText() , this );
903904
dlg.setWindowTitle( tr( "Expression based label" ) );
905+
906+
QgsDistanceArea myDa;
907+
myDa.setSourceCrs( mLayer->crs().srsid() );
908+
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() );
909+
myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) );
910+
dlg.setGeomCalculator( myDa );
911+
904912
if ( dlg.exec() == QDialog::Accepted )
905913
{
906914
QString expression = dlg.expressionText();

src/app/qgsmaptoolidentify.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,8 @@ bool QgsMapToolIdentify::identifyVectorLayer( QgsVectorLayer *layer, int x, int
214214
// load identify radius from settings
215215
QSettings settings;
216216
double identifyValue = settings.value( "/Map/identifyRadius", QGis::DEFAULT_IDENTIFY_RADIUS ).toDouble();
217-
QString ellipsoid = settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString();
217+
218+
QString ellipsoid = QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE );
218219

219220
if ( identifyValue <= 0.0 )
220221
identifyValue = QGis::DEFAULT_IDENTIFY_RADIUS;

src/app/qgsmaptoolmeasureangle.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "qgslogger.h"
2020
#include "qgsmapcanvas.h"
2121
#include "qgsmaptopixel.h"
22+
#include "qgsproject.h"
2223
#include "qgsrubberband.h"
2324
#include <QMouseEvent>
2425
#include <QSettings>
@@ -182,7 +183,7 @@ void QgsMapToolMeasureAngle::updateSettings()
182183
void QgsMapToolMeasureAngle::configureDistanceArea()
183184
{
184185
QSettings settings;
185-
QString ellipsoidId = settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString();
186+
QString ellipsoidId = QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE );
186187
mDa.setSourceCrs( mCanvas->mapRenderer()->destinationCrs().srsid() );
187188
mDa.setEllipsoid( ellipsoidId );
188189
// Only use ellipsoidal calculation when project wide transformation is enabled.

src/app/qgsmeasuredialog.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "qgsdistancearea.h"
2323
#include "qgsmapcanvas.h"
2424
#include "qgsmaprenderer.h"
25+
#include "qgsproject.h"
2526
#include "qgscoordinatereferencesystem.h"
2627

2728
#include <QCloseEvent>
@@ -60,7 +61,7 @@ void QgsMeasureDialog::updateSettings()
6061
mDisplayUnits = QGis::fromLiteral( settings.value( "/qgis/measure/displayunits", QGis::toLiteral( QGis::Meters ) ).toString() );
6162
// Configure QgsDistanceArea
6263
mDa.setSourceCrs( mTool->canvas()->mapRenderer()->destinationCrs().srsid() );
63-
mDa.setEllipsoid( settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString() );
64+
mDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) );
6465
// Only use ellipsoidal calculation when project wide transformation is enabled.
6566
if ( mTool->canvas()->mapRenderer()->hasCrsTransformEnabled() )
6667
{

0 commit comments

Comments
 (0)