1919#include < cmath>
2020
2121
22- double QgsTolerance::toleranceInMapUnits ( double tolerance, const QgsMapSettings& mapSettings, QgsTolerance::UnitType units )
22+ // return ratio [mu/lu] between map units and layer units
23+ // this is of course only an approximation
24+ double _ratioMU2LU ( const QgsMapSettings& mapSettings, QgsMapLayer* layer )
25+ {
26+ double distMU = mapSettings.mapUnitsPerPixel ();
27+ QgsPoint ptMapCenterMU = mapSettings.visibleExtent ().center ();
28+ QgsPoint ptMapCenterRightMU ( ptMapCenterMU.x () + distMU, ptMapCenterMU.y () );
29+ QgsPoint ptMapCenterLU = mapSettings.mapToLayerCoordinates ( layer, ptMapCenterMU );
30+ QgsPoint ptMapCenterRightLU = mapSettings.mapToLayerCoordinates ( layer, ptMapCenterRightMU );
31+ double distLU = sqrt ( ptMapCenterLU.sqrDist ( ptMapCenterRightLU ) );
32+ double ratio = distMU / distLU;
33+ return ratio;
34+ }
35+
36+ double QgsTolerance::toleranceInProjectUnits (double tolerance, QgsMapLayer* layer, const QgsMapSettings& mapSettings, QgsTolerance::UnitType units )
2337{
2438 // converts to map units
25- if ( units == MapUnits )
39+ if ( units == ProjectUnits )
2640 return tolerance;
27- else
41+ else if ( units == Pixels )
2842 return tolerance * mapSettings.mapUnitsPerPixel ();
43+ else // units == LayerUnits
44+ {
45+ // [mu] = [lu] * [mu/lu]
46+ return tolerance * _ratioMU2LU ( mapSettings, layer );
47+ }
2948}
3049
50+
3151double QgsTolerance::toleranceInMapUnits ( double tolerance, QgsMapLayer *layer, const QgsMapSettings& mapSettings, QgsTolerance::UnitType units )
3252{
3353 // converts to layer units
34- if ( units == MapUnits )
54+ if ( units == LayerUnits )
3555 {
3656 return tolerance;
3757 }
38- double mapUnitsPerPixel = computeMapUnitPerPixel ( layer, mapSettings );
39- return tolerance * mapUnitsPerPixel;
58+ else if ( units == Pixels )
59+ {
60+ double layerUnitsPerPixel = computeMapUnitPerPixel ( layer, mapSettings );
61+ return tolerance * layerUnitsPerPixel;
62+ }
63+ else // ProjectUnits
64+ {
65+ // [lu] = [mu] / [mu/lu]
66+ return tolerance / _ratioMU2LU ( mapSettings, layer );
67+ }
4068}
4169
4270double QgsTolerance::toleranceInMapUnits ( double tolerance, QgsMapLayer* layer, QgsMapRenderer* renderer, UnitType units )
@@ -49,7 +77,9 @@ double QgsTolerance::vertexSearchRadius( const QgsMapSettings& mapSettings )
4977 QSettings settings;
5078 double tolerance = settings.value ( " /qgis/digitizing/search_radius_vertex_edit" , 10 ).toDouble ();
5179 UnitType units = ( QgsTolerance::UnitType ) settings.value ( " /qgis/digitizing/search_radius_vertex_edit_unit" , QgsTolerance::Pixels ).toInt ();
52- return toleranceInMapUnits ( tolerance, mapSettings, units );
80+ if ( units == LayerUnits )
81+ units = ProjectUnits;
82+ return toleranceInProjectUnits ( tolerance, 0 , mapSettings, units );
5383}
5484
5585double QgsTolerance::vertexSearchRadius ( QgsMapLayer *layer, const QgsMapSettings &mapSettings )
@@ -69,7 +99,7 @@ double QgsTolerance::defaultTolerance( QgsMapLayer *layer, const QgsMapSettings&
6999{
70100 QSettings settings;
71101 double tolerance = settings.value ( " /qgis/digitizing/default_snapping_tolerance" , 0 ).toDouble ();
72- UnitType units = ( QgsTolerance::UnitType ) settings.value ( " /qgis/digitizing/default_snapping_tolerance_unit" , 0 ).toInt ();
102+ UnitType units = ( QgsTolerance::UnitType ) settings.value ( " /qgis/digitizing/default_snapping_tolerance_unit" , ProjectUnits ).toInt ();
73103 return toleranceInMapUnits ( tolerance, layer, mapSettings, units );
74104}
75105
0 commit comments