Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[FEATURE] New snapping API with improved indexing (QEP 13)
Merge branch 'snapping-improved'
- Loading branch information
Showing
52 changed files
with
2,796 additions
and
485 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
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,87 @@ | ||
|
||
class QgsPointLocator : QObject | ||
{ | ||
%TypeHeaderCode | ||
#include <qgspointlocator.h> | ||
%End | ||
|
||
public: | ||
/** Construct point locator for a layer. | ||
* @arg destCRS if not null, will do the searches on data reprojected to the given CRS | ||
* @arg extent if not null, will index only a subset of the layer | ||
*/ | ||
explicit QgsPointLocator( QgsVectorLayer* layer, const QgsCoordinateReferenceSystem* destCRS = 0, const QgsRectangle* extent = 0 ); | ||
|
||
~QgsPointLocator(); | ||
|
||
enum Type { Invalid, Vertex, Edge, Area, All }; | ||
|
||
/** Prepare the index for queries. Does nothing if the index already exists */ | ||
void init(); | ||
|
||
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() const; | ||
|
||
//! reference vector layer | ||
QgsVectorLayer* layer() const; | ||
|
||
QgsFeatureId featureId() const; | ||
|
||
//! 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; | ||
}; | ||
|
||
// intersection queries | ||
|
||
//! Find nearest vertex to the specified point - up to distance specified by tolerance | ||
//! Optional filter may discard unwanted matches. | ||
Match nearestVertex( const QgsPoint& point, double tolerance, QgsPointLocator::MatchFilter* filter = 0 ); | ||
//! Find nearest edges to the specified point - up to distance specified by tolerance | ||
//! Optional filter may discard unwanted matches. | ||
Match nearestEdge( const QgsPoint& point, double tolerance, QgsPointLocator::MatchFilter* filter = 0 ); | ||
//! Find edges within a specified recangle | ||
//! Optional filter may discard unwanted matches. | ||
MatchList edgesInRect( const QgsRectangle& rect, QgsPointLocator::MatchFilter* filter = 0 ); | ||
//! Override of edgesInRect that construct rectangle from a center point and tolerance | ||
MatchList edgesInRect( const QgsPoint& point, double tolerance, 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,90 @@ | ||
|
||
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 ); | ||
|
||
/** 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; | ||
|
||
enum IndexingStrategy | ||
{ | ||
IndexAlwaysFull, //!< For all layers build index of full extent. Uses more memory, but queries are faster. | ||
IndexNeverFull, //!< For all layers only create temporary indexes of small extent. Low memory usage, slower queries. | ||
IndexHybrid //!< For "big" layers using IndexNeverFull, for the rest IndexAlwaysFull. Compromise between speed and memory usage. | ||
}; | ||
|
||
/** Set a strategy for indexing geometry data - determines how fast and memory consuming the data structures will be */ | ||
void setIndexingStrategy( IndexingStrategy strategy ); | ||
/** Find out which strategy is used for indexing - by default hybrid indexing is used */ | ||
IndexingStrategy indexingStrategy() 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.