Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add QgsSnappingUtils::snapToCurrentLayer() + utility methods in QgsTo…
…lerance Also added missing SIP wrappers for new classes QgsPointLocator and QgsSnappingUtils
- Loading branch information
Showing
9 changed files
with
309 additions
and
57 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
|
||
class QgsPointLocator : QObject | ||
{ | ||
%TypeHeaderCode | ||
#include <qgspointlocator.h> | ||
%End | ||
|
||
public: | ||
explicit QgsPointLocator( QgsVectorLayer* layer, const QgsCoordinateReferenceSystem* destCRS = 0 ); | ||
|
||
~QgsPointLocator(); | ||
|
||
enum Type { Invalid, Vertex, Edge, Area, All }; | ||
|
||
/** Prepare the indexes for given or-ed combination of query types (Vertex, Edge, Area). | ||
* If not initialized explicitly, index of particular type will be inited when first such query is issued. | ||
*/ | ||
void init( int types = All, bool force = false ); | ||
|
||
//! check whether index for given query type exists | ||
bool hasIndex( Type t ) const; | ||
|
||
struct Match | ||
{ | ||
//! consruct invalid match | ||
Match(); | ||
|
||
Match( QgsPointLocator::Type t, QgsVectorLayer* vl, QgsFeatureId fid, double dist, const QgsPoint& pt, int vertexIndex = 0 ); | ||
|
||
QgsPointLocator::Type type() const; | ||
|
||
bool isValid() const; | ||
bool hasVertex() const; | ||
bool hasEdge() const; | ||
bool hasArea() const; | ||
|
||
//! for vertex / edge match | ||
//! units depending on what class returns it (geom.cache: layer units, map canvas snapper: dest crs units) | ||
double distance() const; | ||
|
||
//! for vertex / edge match | ||
//! coords depending on what class returns it (geom.cache: layer coords, map canvas snapper: dest coords) | ||
QgsPoint point() const; | ||
|
||
//! for vertex / edge match (first vertex of the edge) | ||
int vertexIndex(); | ||
|
||
//! reference vector layer | ||
QgsVectorLayer* layer(); | ||
|
||
QgsFeatureId featureId(); | ||
|
||
void replaceIfBetter( const QgsPointLocator::Match& m, double maxDistance ); | ||
|
||
//! Only for a valid edge match - obtain endpoints of the edge | ||
void edgePoints( QgsPoint& pt1 /Out/, QgsPoint& pt2 /Out/ ) const; | ||
}; | ||
|
||
typedef QList<QgsPointLocator::Match> MatchList; | ||
|
||
//! Interface that allows rejection of some matches in intersection queries | ||
//! (e.g. a match can only belong to a particular feature / match must not be a particular point). | ||
//! Implement the interface and pass its instance to QgsPointLocator or QgsSnappingUtils methods. | ||
struct MatchFilter | ||
{ | ||
virtual bool acceptMatch( const QgsPointLocator::Match& match ) = 0; | ||
}; | ||
|
||
// 1-NN queries | ||
|
||
//! find nearest vertex to the specified point | ||
QgsPointLocator::Match nearestVertex( const QgsPoint& point ); | ||
|
||
//! find nearest edge to the specified point | ||
QgsPointLocator::Match nearestEdge( const QgsPoint& point ); | ||
|
||
// k-NN queries | ||
|
||
//! find nearest vertices to the specified point - sorted by distance | ||
//! will return up to maxMatches matches | ||
MatchList nearestVertices( const QgsPoint& point, int maxMatches ); | ||
//! find nearest edges to the specified point - sorted by distance | ||
MatchList nearestEdges( const QgsPoint& point, int maxMatches ); | ||
|
||
// intersection queries | ||
|
||
//! Find nearest vertices to the specified point - sorted by distance. | ||
//! Will return matches up to distance given by tolerance. | ||
//! Optional filter may discard unwanted matches. | ||
MatchList verticesInTolerance( const QgsPoint& point, double tolerance, QgsPointLocator::MatchFilter* filter = 0 ); | ||
//! Find nearest edges to the specified point - sorted by distance. | ||
//! Will return matches up to distance given by tolerance. | ||
//! Optional filter may discard unwanted matches. | ||
MatchList edgesInTolerance( const QgsPoint& point, double tolerance, QgsPointLocator::MatchFilter* filter = 0 ); | ||
|
||
//! Find vertices within given rectangle. | ||
//! If distToPoint is given, the matches will be sorted by distance to that point. | ||
//! Optional filter may discard unwanted matches. | ||
MatchList verticesInRect( const QgsRectangle& rect, const QgsPoint* distToPoint = 0, QgsPointLocator::MatchFilter* filter = 0 ); | ||
//! Find edges within given rectangle. | ||
//! If distToPoint is given, the matches will be sorted by distance to that point. | ||
//! Optional filter may discard unwanted matches. | ||
MatchList edgesInRect( const QgsRectangle& rect, const QgsPoint* distToPoint = 0, QgsPointLocator::MatchFilter* filter = 0 ); | ||
|
||
// point-in-polygon query | ||
|
||
// TODO: function to return just the first match? | ||
//! find out if the point is in any polygons | ||
MatchList pointInPolygon( const QgsPoint& point ); | ||
|
||
|
||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
|
||
class QgsSnappingUtils : QObject | ||
{ | ||
%TypeHeaderCode | ||
#include <qgssnappingutils.h> | ||
%End | ||
|
||
public: | ||
QgsSnappingUtils( QObject* parent /TransferThis/ = 0 ); | ||
~QgsSnappingUtils(); | ||
|
||
// main actions | ||
|
||
/** get a point locator for the given layer. If such locator does not exist, it will be created */ | ||
QgsPointLocator* locatorForLayer( QgsVectorLayer* vl ); | ||
|
||
/** snap to map according to the current configuration (mode). Optional filter allows to discard unwanted matches. */ | ||
QgsPointLocator::Match snapToMap( const QPoint& point, QgsPointLocator::MatchFilter* filter = 0 ); | ||
QgsPointLocator::Match snapToMap( const QgsPoint& pointMap, QgsPointLocator::MatchFilter* filter = 0 ); | ||
// TODO: multi-variant | ||
|
||
/** snap to current layer */ | ||
QgsPointLocator::Match snapToCurrentLayer( const QPoint& point, int type, QgsPointLocator::MatchFilter* filter = 0 ); | ||
|
||
// environment setup | ||
|
||
/** assign current map settings to the utils - used for conversion between screen coords to map coords */ | ||
void setMapSettings( const QgsMapSettings& settings ); | ||
const QgsMapSettings& mapSettings() const; | ||
|
||
/** set current layer so that if mode is SnapCurrentLayer we know which layer to use */ | ||
void setCurrentLayer( QgsVectorLayer* layer ); | ||
QgsVectorLayer* currentLayer() const; | ||
|
||
|
||
// configuration | ||
|
||
//! modes for "snap to background" | ||
enum SnapToMapMode | ||
{ | ||
SnapCurrentLayer, //!< snap just to current layer (tolerance+type from QSettings) | ||
SnapPerLayerConfig, //!< snap according to the configuration set in setLayers() | ||
}; | ||
|
||
/** Set how the snapping to map is done */ | ||
void setSnapToMapMode( SnapToMapMode mode ); | ||
/** Find out how the snapping to map is done */ | ||
SnapToMapMode snapToMapMode() const; | ||
|
||
/** configure options used when the mode is snap to current layer */ | ||
void setDefaultSettings( int type, double tolerance, QgsTolerance::UnitType unit ); | ||
/** query options used when the mode is snap to current layer */ | ||
void defaultSettings( int& type /Out/, double& tolerance /Out/, QgsTolerance::UnitType& unit /Out/ ); | ||
|
||
struct LayerConfig | ||
{ | ||
LayerConfig( QgsVectorLayer* l, int t, double tol, QgsTolerance::UnitType u ); | ||
|
||
QgsVectorLayer* layer; | ||
int type; | ||
double tolerance; | ||
QgsTolerance::UnitType unit; | ||
}; | ||
|
||
/** Set layers which will be used for snapping */ | ||
void setLayers( const QList<QgsSnappingUtils::LayerConfig>& layers ); | ||
/** Query layers used for snapping */ | ||
QList<QgsSnappingUtils::LayerConfig> layers() const; | ||
|
||
/** Set whether to consider intersections of nearby segments for snapping */ | ||
void setSnapOnIntersections( bool enabled ); | ||
/** Query whether to consider intersections of nearby segments for snapping */ | ||
bool snapOnIntersections() const; | ||
|
||
public slots: | ||
/** Read snapping configuration from the project */ | ||
void readConfigFromProject(); | ||
|
||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.