Skip to content

Commit

Permalink
A stab at improving the measurement system. Added a new selector in O…
Browse files Browse the repository at this point in the history
…ptions for converting the result, and grayed out the layer units when OTFP is on. Should fix #1219, I hope.

git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@11340 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
homann committed Aug 10, 2009
1 parent 52996e7 commit 3c6a232
Show file tree
Hide file tree
Showing 8 changed files with 125 additions and 12 deletions.
4 changes: 3 additions & 1 deletion src/app/qgisapp.cpp
Expand Up @@ -5435,7 +5435,9 @@ void QgisApp::projectProperties()
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();


//pass any refresg signals off to canvases //pass any refresg signals off to canvases
//connect (pp,SIGNAL(refresh()), mMapCanvas, SLOT(refresh())); // Line below was commented out by wonder three years ago (r4949).
// It is needed to refresh scale bar after changing display units.
connect (pp,SIGNAL(refresh()), mMapCanvas, SLOT(refresh()));


QgsMapRenderer* myRender = mMapCanvas->mapRenderer(); QgsMapRenderer* myRender = mMapCanvas->mapRenderer();
bool wasProjected = myRender->hasCrsTransformEnabled(); bool wasProjected = myRender->hasCrsTransformEnabled();
Expand Down
76 changes: 66 additions & 10 deletions src/app/qgsmeasuredialog.cpp
Expand Up @@ -18,6 +18,7 @@
#include "qgsmeasuredialog.h" #include "qgsmeasuredialog.h"
#include "qgsmeasuretool.h" #include "qgsmeasuretool.h"


#include "qgslogger.h"
#include "qgscontexthelp.h" #include "qgscontexthelp.h"
#include "qgsdistancearea.h" #include "qgsdistancearea.h"
#include "qgsmapcanvas.h" #include "qgsmapcanvas.h"
Expand Down Expand Up @@ -89,16 +90,22 @@ void QgsMeasureDialog::mouseMove( QgsPoint &point )
QList<QgsPoint> tmpPoints = mTool->points(); QList<QgsPoint> tmpPoints = mTool->points();
tmpPoints.append( point ); tmpPoints.append( point );
double area = mTool->canvas()->mapRenderer()->distanceArea()->measurePolygon( tmpPoints ); double area = mTool->canvas()->mapRenderer()->distanceArea()->measurePolygon( tmpPoints );
QGis::UnitType myDisplayUnits;
// Ignore units
convertMeasurement( area, myDisplayUnits, true );
editTotal->setText( formatArea( area ) ); editTotal->setText( formatArea( area ) );
} }
else if ( !mMeasureArea && mTool->points().size() > 0 ) else if ( !mMeasureArea && mTool->points().size() > 0 )
{ {
QgsPoint p1( mTool->points().last() ), p2( point ); QgsPoint p1( mTool->points().last() ), p2( point );


double d = mTool->canvas()->mapRenderer()->distanceArea()->measureLine( p1, p2 ); double d = mTool->canvas()->mapRenderer()->distanceArea()->measureLine( p1, p2 );
editTotal->setText( formatDistance( mTotal + d ) );
QGis::UnitType myDisplayUnits;
// Ignore units
convertMeasurement( d, myDisplayUnits, false );
QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 ); QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 );
item->setText( 0, QLocale::system().toString( d, 'f', 2 ) ); item->setText( 0, QLocale::system().toString( d, 'f', 2 ) );
editTotal->setText( formatDistance( mTotal + d ) );
} }
} }


Expand All @@ -108,6 +115,9 @@ void QgsMeasureDialog::addPoint( QgsPoint &point )
if ( mMeasureArea && numPoints > 2 ) if ( mMeasureArea && numPoints > 2 )
{ {
double area = mTool->canvas()->mapRenderer()->distanceArea()->measurePolygon( mTool->points() ); double area = mTool->canvas()->mapRenderer()->distanceArea()->measurePolygon( mTool->points() );
QGis::UnitType myDisplayUnits;
// Ignore units
convertMeasurement( area, myDisplayUnits, true );
editTotal->setText( formatArea( area ) ); editTotal->setText( formatArea( area ) );
} }
else if ( !mMeasureArea && numPoints > 1 ) else if ( !mMeasureArea && numPoints > 1 )
Expand All @@ -121,6 +131,10 @@ void QgsMeasureDialog::addPoint( QgsPoint &point )
mTotal += d; mTotal += d;
editTotal->setText( formatDistance( mTotal ) ); editTotal->setText( formatDistance( mTotal ) );


QGis::UnitType myDisplayUnits;
// Ignore units
convertMeasurement( d, myDisplayUnits, false );

QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 ); QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 );
item->setText( 0, QLocale::system().toString( d, 'f', 2 ) ); item->setText( 0, QLocale::system().toString( d, 'f', 2 ) );


Expand Down Expand Up @@ -173,24 +187,26 @@ void QgsMeasureDialog::on_btnHelp_clicked()


QString QgsMeasureDialog::formatDistance( double distance ) QString QgsMeasureDialog::formatDistance( double distance )
{ {
QString txt; QGis::UnitType myDisplayUnits;
QString unitLabel; convertMeasurement( distance, myDisplayUnits, false );

return QgsDistanceArea::textUnit( distance, 2, myDisplayUnits, false );
QGis::UnitType myMapUnits = mTool->canvas()->mapUnits();
return QgsDistanceArea::textUnit( distance, 2, myMapUnits, false );
} }


QString QgsMeasureDialog::formatArea( double area ) QString QgsMeasureDialog::formatArea( double area )
{ {
QGis::UnitType myMapUnits = mTool->canvas()->mapUnits(); QGis::UnitType myDisplayUnits;
return QgsDistanceArea::textUnit( area, 2, myMapUnits, true ); convertMeasurement( area, myDisplayUnits, true );
return QgsDistanceArea::textUnit( area, 2, myDisplayUnits, true );
} }


void QgsMeasureDialog::updateUi() void QgsMeasureDialog::updateUi()
{ {
double dummy = 1.0;
QGis::UnitType myDisplayUnits;
// The dummy distance is ignored
convertMeasurement( dummy, myDisplayUnits, false );


QGis::UnitType myMapUnits = mTool->canvas()->mapUnits(); switch ( myDisplayUnits )
switch ( myMapUnits )
{ {
case QGis::Meters: case QGis::Meters:
mTable->setHeaderLabels( QStringList( tr( "Segments (in meters)" ) ) ); mTable->setHeaderLabels( QStringList( tr( "Segments (in meters)" ) ) );
Expand Down Expand Up @@ -218,3 +234,43 @@ void QgsMeasureDialog::updateUi()


} }


void QgsMeasureDialog::convertMeasurement(double &measure, QGis::UnitType &u, bool isArea)
{
// Helper for converting between meters and feet
// The parameter &u is out only...

QGis::UnitType myUnits = mTool->canvas()->mapUnits();
if ( myUnits == QGis::Degrees &&
mTool->canvas()->mapRenderer()->distanceArea()->ellipsoid() != "NONE" &&
mTool->canvas()->mapRenderer()->distanceArea()->hasCrsTransformEnabled() )
{
// Measuring on an ellipsoid returns meters
myUnits = QGis::Meters;
}

// Get the units for display
QSettings settings;
QString myDisplayUnitsTxt = settings.value( "/qgis/measure/displayunits", "meters").toString();

// Only convert between meters and feet
if ( myUnits == QGis::Meters && myDisplayUnitsTxt == "feet" )
{
measure /= 0.3048;
if ( isArea )
{
measure /= 0.3048;
}
myUnits = QGis::Feet;
}
if ( myUnits == QGis::Feet && myDisplayUnitsTxt == "meters" )
{
measure *= 0.3048 * 0.3048;
if ( isArea )
{
measure *= 0.3048;
}
myUnits = QGis::Meters;
}

u = myUnits;
}
4 changes: 4 additions & 0 deletions src/app/qgsmeasuredialog.h
Expand Up @@ -20,6 +20,7 @@
#include "ui_qgsmeasurebase.h" #include "ui_qgsmeasurebase.h"


#include "qgspoint.h" #include "qgspoint.h"
#include "qgsdistancearea.h"


class QCloseEvent; class QCloseEvent;
class QgsMeasureTool; class QgsMeasureTool;
Expand Down Expand Up @@ -72,6 +73,9 @@ class QgsMeasureDialog : public QDialog, private Ui::QgsMeasureBase
//! shows/hides table, shows correct units //! shows/hides table, shows correct units
void updateUi(); void updateUi();


//! Converts the measurement, depending on settings in options and current transformation
void convertMeasurement(double &measure, QGis::UnitType &u, bool isArea);

double mTotal; double mTotal;


//! Help context id //! Help context id
Expand Down
20 changes: 20 additions & 0 deletions src/app/qgsoptions.cpp
Expand Up @@ -113,6 +113,17 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WFlags fl ) :
getEllipsoidList(); getEllipsoidList();
QString myEllipsoidId = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString(); QString myEllipsoidId = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString();
cmbEllipsoid->setItemText( cmbEllipsoid->currentIndex(), getEllipsoidName( myEllipsoidId ) ); cmbEllipsoid->setItemText( cmbEllipsoid->currentIndex(), getEllipsoidName( myEllipsoidId ) );

// Set the units for measuring
QString myUnitsTxt = settings.value( "/qgis/measure/displayunits", "meters").toString();
if ( myUnitsTxt == "feet" )
{
radFeet->setChecked( true );
} else {
radMeters->setChecked( true );
}


// add the themes to the combo box on the option dialog // add the themes to the combo box on the option dialog
QDir myThemeDir( QgsApplication::pkgDataPath() + "/themes/" ); QDir myThemeDir( QgsApplication::pkgDataPath() + "/themes/" );
myThemeDir.setFilter( QDir::Dirs ); myThemeDir.setFilter( QDir::Dirs );
Expand Down Expand Up @@ -402,6 +413,15 @@ void QgsOptions::saveOptions()


settings.setValue( "/qgis/measure/ellipsoid", getEllipsoidAcronym( cmbEllipsoid->currentText() ) ); settings.setValue( "/qgis/measure/ellipsoid", getEllipsoidAcronym( cmbEllipsoid->currentText() ) );


if ( radFeet->isChecked() )
{
settings.setValue( "/qgis/measure/displayunits", "feet" );
}
else
{
settings.setValue( "/qgis/measure/displayunits", "meters" );
}
settings.setValue( "/qgis/measure/ellipsoid", getEllipsoidAcronym( cmbEllipsoid->currentText() ) );
//set the colour for selections //set the colour for selections
QColor myColor = pbnSelectionColour->color(); QColor myColor = pbnSelectionColour->color();
settings.setValue( "/qgis/default_selection_color_red", myColor.red() ); settings.setValue( "/qgis/default_selection_color_red", myColor.red() );
Expand Down
7 changes: 7 additions & 0 deletions src/app/qgsprojectproperties.cpp
Expand Up @@ -58,6 +58,7 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa
//see if the user wants on the fly projection enabled //see if the user wants on the fly projection enabled
bool myProjectionEnabled = myRender->hasCrsTransformEnabled(); bool myProjectionEnabled = myRender->hasCrsTransformEnabled();
cbxProjectionEnabled->setChecked( myProjectionEnabled ); cbxProjectionEnabled->setChecked( myProjectionEnabled );
btnGrpMapUnits->setEnabled( !myProjectionEnabled );


long myCRSID = myRender->destinationSrs().srsid(); long myCRSID = myRender->destinationSrs().srsid();
QgsDebugMsg( "Read project CRSID: " + QString::number( myCRSID ) ); QgsDebugMsg( "Read project CRSID: " + QString::number( myCRSID ) );
Expand Down Expand Up @@ -430,3 +431,9 @@ void QgsProjectProperties::on_mSnappingOptionsPushButton_clicked()
d.layerSettings( mSnappingLayerSettings ); d.layerSettings( mSnappingLayerSettings );
} }
} }

void QgsProjectProperties::on_cbxProjectionEnabled_stateChanged(int state)
{
btnGrpMapUnits->setEnabled( state == Qt::Unchecked );
}

3 changes: 3 additions & 0 deletions src/app/qgsprojectproperties.h
Expand Up @@ -93,6 +93,9 @@ class QgsProjectProperties : public QDialog, private Ui::QgsProjectPropertiesBas
*/ */
void on_mSnappingOptionsPushButton_clicked(); void on_mSnappingOptionsPushButton_clicked();


void on_cbxProjectionEnabled_stateChanged(int state);


signals: signals:
//! Signal used to inform listeners that the mouse display precision may have changed //! Signal used to inform listeners that the mouse display precision may have changed
void displayPrecisionChanged(); void displayPrecisionChanged();
Expand Down
21 changes: 21 additions & 0 deletions src/ui/qgsoptionsbase.ui
Expand Up @@ -476,6 +476,27 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0">
<widget class="QLabel" name="textLabel1_8">
<property name="text">
<string>Display units (if applicable)</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QRadioButton" name="radMeters">
<property name="text">
<string>Meters</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QRadioButton" name="radFeet">
<property name="text">
<string>Feet</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
Expand Down
2 changes: 1 addition & 1 deletion src/ui/qgsprojectpropertiesbase.ui
Expand Up @@ -139,7 +139,7 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QGroupBox" name="btnGrpMapUnits"> <widget class="QGroupBox" name="btnGrpMapUnits">
<property name="title"> <property name="title">
<string>Map units</string> <string>Layer units (only used when CRS transformation is disabled)</string>
</property> </property>
<layout class="QHBoxLayout"> <layout class="QHBoxLayout">
<property name="margin"> <property name="margin">
Expand Down

0 comments on commit 3c6a232

Please sign in to comment.