@@ -51,9 +51,19 @@ QgsMeasureDialog::QgsMeasureDialog( QgsMeasureTool *tool, Qt::WindowFlags f )
51
51
52
52
repopulateComboBoxUnits ( mMeasureArea );
53
53
if ( mMeasureArea )
54
- mUnitsCombo ->setCurrentIndex ( mUnitsCombo ->findData ( QgsProject::instance ()->areaUnits () ) );
54
+ {
55
+ if ( useMapUnits )
56
+ mUnitsCombo ->setCurrentIndex ( mUnitsCombo ->findData ( QgsUnitTypes::AreaUnknownUnit ) );
57
+ else
58
+ mUnitsCombo ->setCurrentIndex ( mUnitsCombo ->findData ( QgsProject::instance ()->areaUnits () ) );
59
+ }
55
60
else
56
- mUnitsCombo ->setCurrentIndex ( mUnitsCombo ->findData ( QgsProject::instance ()->distanceUnits () ) );
61
+ {
62
+ if ( useMapUnits )
63
+ mUnitsCombo ->setCurrentIndex ( mUnitsCombo ->findData ( QgsUnitTypes::DistanceUnknownUnit ) );
64
+ else
65
+ mUnitsCombo ->setCurrentIndex ( mUnitsCombo ->findData ( QgsProject::instance ()->distanceUnits () ) );
66
+ }
57
67
58
68
if ( !mCanvas ->mapSettings ().destinationCrs ().isValid () )
59
69
{
@@ -103,21 +113,51 @@ void QgsMeasureDialog::updateSettings()
103
113
mCanvasUnits = mCanvas ->mapUnits ();
104
114
// Configure QgsDistanceArea
105
115
mDistanceUnits = QgsProject::instance ()->distanceUnits ();
116
+ mapDistanceUnits = QgsProject::instance ()->crs ().mapUnits ();
106
117
mAreaUnits = QgsProject::instance ()->areaUnits ();
107
118
mDa .setSourceCrs ( mCanvas ->mapSettings ().destinationCrs (), QgsProject::instance ()->transformContext () );
108
119
mDa .setEllipsoid ( QgsProject::instance ()->ellipsoid () );
109
120
110
121
mTable ->clear ();
111
122
mTotal = 0 ;
112
123
updateUi ();
124
+
125
+ if ( !mCanvas ->mapSettings ().destinationCrs ().isValid () ||
126
+ ( mCanvas ->mapSettings ().destinationCrs ().mapUnits () == QgsUnitTypes::DistanceDegrees
127
+ && mDistanceUnits == QgsUnitTypes::DistanceDegrees ) )
128
+ forceCartesian = true ;
129
+ else
130
+ forceCartesian = false ;
113
131
}
114
132
115
133
void QgsMeasureDialog::unitsChanged ( int index )
116
134
{
117
135
if ( mMeasureArea )
136
+ {
118
137
mAreaUnits = static_cast < QgsUnitTypes::AreaUnit >( mUnitsCombo ->itemData ( index ).toInt () );
138
+ if ( mAreaUnits == QgsUnitTypes::AreaUnknownUnit )
139
+ {
140
+ useMapUnits = true ;
141
+ mAreaUnits = QgsUnitTypes::distanceToAreaUnit ( mapDistanceUnits );
142
+ }
143
+ else
144
+ {
145
+ useMapUnits = false ;
146
+ }
147
+ }
119
148
else
149
+ {
120
150
mDistanceUnits = static_cast < QgsUnitTypes::DistanceUnit >( mUnitsCombo ->itemData ( index ).toInt () );
151
+ if ( mDistanceUnits == QgsUnitTypes::DistanceUnknownUnit )
152
+ {
153
+ useMapUnits = true ;
154
+ mDistanceUnits = mapDistanceUnits;
155
+ }
156
+ else
157
+ {
158
+ useMapUnits = false ;
159
+ }
160
+ }
121
161
mTable ->clear ();
122
162
mTotal = 0 .;
123
163
updateUi ();
@@ -142,6 +182,13 @@ void QgsMeasureDialog::restart()
142
182
143
183
void QgsMeasureDialog::mouseMove ( const QgsPointXY &point )
144
184
{
185
+ if ( !mCanvas ->mapSettings ().destinationCrs ().isValid () ||
186
+ ( mCanvas ->mapSettings ().destinationCrs ().mapUnits () == QgsUnitTypes::DistanceDegrees
187
+ && mDistanceUnits == QgsUnitTypes::DistanceDegrees ) )
188
+ forceCartesian = true ;
189
+ else
190
+ forceCartesian = false ;
191
+
145
192
mLastMousePoint = point;
146
193
// show current distance/area while moving the point
147
194
// by creating a temporary copy of point array
@@ -157,11 +204,10 @@ void QgsMeasureDialog::mouseMove( const QgsPointXY &point )
157
204
{
158
205
QVector< QgsPointXY > tmpPoints = mTool ->points ();
159
206
QgsPointXY p1 ( tmpPoints.at ( tmpPoints.size () - 1 ) ), p2 ( point );
160
- double d = mDa .measureLine ( p1, p2 );
161
-
162
- editTotal->setText ( formatDistance ( mTotal + d ) );
163
-
164
- d = convertLength ( d, mDistanceUnits );
207
+ double d = mDa .measureLine ( p1, p2, forceCartesian );
208
+ editTotal->setText ( formatDistance ( mTotal + d, !forceCartesian ) );
209
+ if ( !forceCartesian )
210
+ d = convertLength ( d, mDistanceUnits );
165
211
166
212
// Set moving
167
213
QTreeWidgetItem *item = mTable ->topLevelItem ( mTable ->topLevelItemCount () - 1 );
@@ -191,8 +237,8 @@ void QgsMeasureDialog::addPoint()
191
237
}
192
238
if ( numPoints > 1 )
193
239
{
194
- mTotal = mDa .measureLine ( mTool ->points () );
195
- editTotal->setText ( formatDistance ( mTotal ) );
240
+ mTotal = mDa .measureLine ( mTool ->points (), forceCartesian );
241
+ editTotal->setText ( formatDistance ( mTotal , !forceCartesian ) );
196
242
}
197
243
}
198
244
}
@@ -219,14 +265,14 @@ void QgsMeasureDialog::removeLastPoint()
219
265
// remove final row
220
266
delete mTable ->takeTopLevelItem ( mTable ->topLevelItemCount () - 1 );
221
267
222
- mTotal = mDa .measureLine ( mTool ->points () );
268
+ mTotal = mDa .measureLine ( mTool ->points (), forceCartesian );
223
269
224
270
if ( !mTool ->done () )
225
271
{
226
272
// need to add the distance for the temporary mouse cursor point
227
273
QVector< QgsPointXY > tmpPoints = mTool ->points ();
228
274
QgsPointXY p1 ( tmpPoints.at ( tmpPoints.size () - 1 ) );
229
- double d = mDa .measureLine ( p1, mLastMousePoint );
275
+ double d = mDa .measureLine ( p1, mLastMousePoint , forceCartesian );
230
276
231
277
d = convertLength ( d, mDistanceUnits );
232
278
@@ -236,7 +282,7 @@ void QgsMeasureDialog::removeLastPoint()
236
282
}
237
283
else
238
284
{
239
- editTotal->setText ( formatDistance ( mTotal ) );
285
+ editTotal->setText ( formatDistance ( mTotal , !forceCartesian ) );
240
286
}
241
287
}
242
288
}
@@ -297,7 +343,7 @@ QString QgsMeasureDialog::formatArea( double area, bool convertUnits ) const
297
343
298
344
void QgsMeasureDialog::updateUi ()
299
345
{
300
- // Set tooltip to indicate how we calculate measurments
346
+ // Set tooltip to indicate how we calculate measurements
301
347
QString toolTip = tr ( " The calculations are based on:" );
302
348
303
349
bool forceCartesian = false ;
@@ -450,18 +496,25 @@ void QgsMeasureDialog::updateUi()
450
496
451
497
if ( mMeasureArea )
452
498
{
453
- mUnitsCombo ->setCurrentIndex ( mUnitsCombo ->findData ( mAreaUnits ) );
499
+ if ( useMapUnits )
500
+ mUnitsCombo ->setCurrentIndex ( mUnitsCombo ->findData ( QgsUnitTypes::AreaUnknownUnit ) );
501
+ else
502
+ mUnitsCombo ->setCurrentIndex ( mUnitsCombo ->findData ( mAreaUnits ) );
454
503
}
455
504
else
456
505
{
457
- mUnitsCombo ->setCurrentIndex ( mUnitsCombo ->findData ( mDistanceUnits ) );
458
- if ( mDistanceUnits != QgsUnitTypes::DistanceUnknownUnit )
506
+ if ( useMapUnits )
459
507
{
460
- mTable ->setHeaderLabels ( QStringList ( tr ( " Segments [%1]" ).arg ( QgsUnitTypes::toString ( mDistanceUnits ) ) ) );
508
+ mUnitsCombo ->setCurrentIndex ( mUnitsCombo ->findData ( QgsUnitTypes::DistanceUnknownUnit ) );
509
+ mTable ->setHeaderLabels ( QStringList ( tr ( " Segments [%1]" ).arg ( QgsUnitTypes::toString ( mapDistanceUnits ) ) ) );
461
510
}
462
511
else
463
512
{
464
- mTable ->setHeaderLabels ( QStringList ( tr ( " Segments" ) ) );
513
+ mUnitsCombo ->setCurrentIndex ( mUnitsCombo ->findData ( mDistanceUnits ) );
514
+ if ( mDistanceUnits != QgsUnitTypes::DistanceUnknownUnit )
515
+ mTable ->setHeaderLabels ( QStringList ( tr ( " Segments [%1]" ).arg ( QgsUnitTypes::toString ( mDistanceUnits ) ) ) );
516
+ else
517
+ mTable ->setHeaderLabels ( QStringList ( tr ( " Segments" ) ) );
465
518
}
466
519
}
467
520
@@ -489,16 +542,13 @@ void QgsMeasureDialog::updateUi()
489
542
if ( !b )
490
543
{
491
544
double d = -1 ;
492
- if ( forceCartesian )
545
+ d = mDa .measureLine ( p1, p2, forceCartesian );
546
+ if ( !forceCartesian )
493
547
{
494
- // Cartesian calculation forced
495
- d = std::sqrt ( p2.sqrDist ( p1 ) );
496
- mTotal += d;
497
- }
498
- else
499
- {
500
- d = mDa .measureLine ( p1, p2 );
501
- d = convertLength ( d, mDistanceUnits );
548
+ if ( mDistanceUnits == QgsUnitTypes::DistanceUnknownUnit && mapDistanceUnits != QgsUnitTypes::DistanceUnknownUnit )
549
+ d = convertLength ( d, mapDistanceUnits );
550
+ else
551
+ d = convertLength ( d, mDistanceUnits );
502
552
}
503
553
504
554
QTreeWidgetItem *item = new QTreeWidgetItem ( QStringList ( QLocale ().toString ( d, ' f' , mDecimalPlaces ) ) );
@@ -510,8 +560,7 @@ void QgsMeasureDialog::updateUi()
510
560
b = false ;
511
561
}
512
562
513
- if ( !forceCartesian )
514
- mTotal = mDa .measureLine ( mTool ->points () );
563
+ mTotal = mDa .measureLine ( mTool ->points (), forceCartesian );
515
564
mTable ->show (); // Show the table with items
516
565
editTotal->setText ( formatDistance ( mTotal , convertToDisplayUnits ) );
517
566
}
0 commit comments