00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "qgstolerance.h"
00017 #include <QSettings>
00018 #include <QPoint>
00019 #include <math.h>
00020
00021
00022
00023 double QgsTolerance::toleranceInMapUnits( double tolerance, QgsMapLayer* layer, QgsMapRenderer* renderer, UnitType units )
00024 {
00025 if ( units == MapUnits )
00026 {
00027 return tolerance;
00028 }
00029 double mapUnitsPerPixel = computeMapUnitPerPixel( layer, renderer );
00030 return tolerance * mapUnitsPerPixel;
00031 }
00032
00033
00034 double QgsTolerance::vertexSearchRadius( QgsMapLayer* layer, QgsMapRenderer* renderer )
00035 {
00036 QSettings settings;
00037 double tolerance = settings.value( "/qgis/digitizing/search_radius_vertex_edit", 10 ).toDouble();
00038 UnitType units = ( QgsTolerance::UnitType ) settings.value( "/qgis/digitizing/search_radius_vertex_edit_unit", QgsTolerance::Pixels ).toInt();
00039 return toleranceInMapUnits( tolerance, layer, renderer, units );
00040 }
00041
00042
00043 double QgsTolerance::defaultTolerance( QgsMapLayer* layer, QgsMapRenderer* renderer )
00044 {
00045 QSettings settings;
00046 double tolerance = settings.value( "/qgis/digitizing/default_snapping_tolerance", 0 ).toDouble();
00047 UnitType units = ( QgsTolerance::UnitType ) settings.value( "/qgis/digitizing/default_snapping_tolerance_unit", 0 ).toInt();
00048 return toleranceInMapUnits( tolerance, layer, renderer, units );
00049 }
00050
00051
00052 double QgsTolerance::computeMapUnitPerPixel( QgsMapLayer* layer, QgsMapRenderer* renderer )
00053 {
00054 if ( ! renderer->hasCrsTransformEnabled() )
00055 {
00056
00057 return renderer->mapUnitsPerPixel();
00058 }
00059
00060
00061
00062
00063 QgsPoint p1 = toLayerCoordinates( layer, renderer, QPoint( 0, 1 ) );
00064 QgsPoint p2 = toLayerCoordinates( layer, renderer, QPoint( 0, 2 ) );
00065 QgsPoint p3 = toLayerCoordinates( layer, renderer, QPoint( 1, 0 ) );
00066 QgsPoint p4 = toLayerCoordinates( layer, renderer, QPoint( 2, 0 ) );
00067 double x = p1.sqrDist( p2 );
00068 double y = p3.sqrDist( p4 );
00069 if ( x > y )
00070 {
00071 return sqrt( x );
00072 }
00073 else
00074 {
00075 return sqrt( y );
00076 }
00077 }
00078
00079
00080 QgsPoint QgsTolerance::toLayerCoordinates( QgsMapLayer* layer, QgsMapRenderer* renderer, const QPoint& point )
00081 {
00082 QgsPoint pt = renderer->coordinateTransform()->toMapCoordinates( point );
00083 return renderer->mapToLayerCoordinates( layer, pt );
00084 }