Skip to content
Permalink
Browse files
In Vertex editing, if editing a polygon, preference is now given to e…
…diting the polygon that the mouse is in (as opposed to an adjacent polygon whose edge passes equally close to the mouse). Previously the polygon choice was essentially random (being which one had the lower feature ID).

This is solving a similar problem to the linestring case in r5550.


git-svn-id: http://svn.osgeo.org/qgis/trunk@5569 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
morb_au committed Jul 8, 2006
1 parent 002e57a commit dc63a47a42987a7cea01141b102d85619f30f605
Showing with 71 additions and 7 deletions.
  1. +14 −0 src/core/qgsgeometry.cpp
  2. +5 −1 src/core/qgsgeometry.h
  3. +52 −6 src/gui/qgsvectorlayer.cpp
@@ -2088,6 +2088,20 @@ bool QgsGeometry::intersects(QgsRect* r) const
}


bool QgsGeometry::contains(QgsPoint* p) const
{
bool returnval = false;

exportWkbToGeos();

geos::Point* geosPoint = geosGeometryFactory->createPoint(geos::Coordinate(p->x(), p->y()));

return mGeos->contains(geosPoint);

delete geosPoint;
}


bool QgsGeometry::exportToWkt(unsigned char * geom) const
{
#ifdef QGISDEBUG
@@ -178,9 +178,12 @@ class QgsGeometry {
/**Returns the bounding box of this feature*/
QgsRect boundingBox() const;

/**Test for intersection with a rectangle (uses GEOS)*/
/** Test for intersection with a rectangle (uses GEOS) */
bool intersects(QgsRect* r) const;

/** Test for containment of a point (uses GEOS) */
bool contains(QgsPoint* p) const;

/**Creates a geos geometry from this features geometry. Note, that the returned object needs to be deleted*/
geos::Geometry* geosGeometry() const;

@@ -190,6 +193,7 @@ class QgsGeometry {

// Private static members

//! This is used to create new GEOS variables.
static geos::GeometryFactory* geosGeometryFactory;


@@ -1271,6 +1271,10 @@ QGis::VectorType QgsVectorLayer::vectorType() const
case QGis::WKBMultiPolygon:
return QGis::Polygon;
}
#ifdef QGISDEBUG
QgsLogger::debug("Warning: Data Provider Geometry type is not recognised, is", type, 1, __FILE__, __FUNCTION__, __LINE__);
#endif

}
else
{
@@ -2857,7 +2861,14 @@ int& snappedFeatureId, QgsGeometry& snappedGeometry, double tolerance)
}

minDistSegPoint = feature->geometry()->closestVertex(origPoint, atVertexTemp, beforeVertexIndexTemp, afterVertexIndexTemp, testSqrDist);
if(testSqrDist < minSqrDist)
if (
(testSqrDist < minSqrDist) ||
(
// this test will "choose" the polygon that the origPoint is in:
(testSqrDist == minSqrDist) &&
(feature->geometry()->contains(&origPoint))
)
)
{
point = minDistSegPoint;
minSqrDist = testSqrDist;
@@ -2887,7 +2898,14 @@ int& snappedFeatureId, QgsGeometry& snappedGeometry, double tolerance)
{
minDistSegPoint = (*iter)->geometry()->closestVertex(origPoint, atVertexTemp, beforeVertexIndexTemp, afterVertexIndexTemp, testSqrDist);
}
if(testSqrDist < minSqrDist)
if (
(testSqrDist < minSqrDist) ||
(
// this test will "choose" the polygon that the origPoint is in:
(testSqrDist == minSqrDist) &&
((*iter)->geometry()->contains(&origPoint))
)
)
{
point = minDistSegPoint;
minSqrDist = testSqrDist;
@@ -2905,7 +2923,14 @@ int& snappedFeatureId, QgsGeometry& snappedGeometry, double tolerance)
for(std::map<int, QgsGeometry>::iterator it = mChangedGeometries.begin(); it != mChangedGeometries.end(); ++it)
{
minDistSegPoint = it->second.closestVertex(origPoint, atVertexTemp, beforeVertexIndexTemp, afterVertexIndexTemp, testSqrDist);
if(testSqrDist < minSqrDist)
if (
(testSqrDist < minSqrDist) ||
(
// this test will "choose" the polygon that the origPoint is in:
(testSqrDist == minSqrDist) &&
(it->second.contains(&origPoint))
)
)
{
point = minDistSegPoint;
minSqrDist = testSqrDist;
@@ -2992,7 +3017,14 @@ QgsGeometry& snappedGeometry, double tolerance)

minDistSegPoint = feature->geometry()->closestSegmentWithContext(origPoint, beforeVertexTemp, testSqrDist);

if (testSqrDist < minSqrDist)
if (
(testSqrDist < minSqrDist) ||
(
// this test will "choose" the polygon that the origPoint is in:
(testSqrDist == minSqrDist) &&
(feature->geometry()->contains(&origPoint))
)
)
{
point = minDistSegPoint;
minSqrDist = testSqrDist;
@@ -3022,7 +3054,14 @@ QgsGeometry& snappedGeometry, double tolerance)
minDistSegPoint = (*iter)->geometry()->closestSegmentWithContext(origPoint, beforeVertexTemp, testSqrDist);
}

if (testSqrDist < minSqrDist)
if (
(testSqrDist < minSqrDist) ||
(
// this test will "choose" the polygon that the origPoint is in:
(testSqrDist == minSqrDist) &&
((*iter)->geometry()->contains(&origPoint))
)
)
{
point = minDistSegPoint;
minSqrDist = testSqrDist;
@@ -3038,7 +3077,14 @@ QgsGeometry& snappedGeometry, double tolerance)
for(std::map<int, QgsGeometry>::iterator it = mChangedGeometries.begin(); it != mChangedGeometries.end(); ++it)
{
minDistSegPoint = it->second.closestSegmentWithContext(origPoint, beforeVertexTemp, testSqrDist);
if(testSqrDist < minSqrDist)
if (
(testSqrDist < minSqrDist) ||
(
// this test will "choose" the polygon that the origPoint is in:
(testSqrDist == minSqrDist) &&
(it->second.contains(&origPoint))
)
)
{
point = minDistSegPoint;
minSqrDist = testSqrDist;

0 comments on commit dc63a47

Please sign in to comment.