Skip to content

Commit fadf6ea

Browse files
author
mhugent
committedApr 25, 2006
cleaned up the code for not commited features/ changed features/ cached features. The 'memory critical' parts should now only happen in editing mode
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@5378 c8812cc2-4d05-0410-92ff-de0c093fc19c

File tree

1 file changed

+131
-290
lines changed

1 file changed

+131
-290
lines changed
 

‎src/gui/qgsvectorlayer.cpp

Lines changed: 131 additions & 290 deletions
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,7 @@ bool QgsVectorLayer::draw(QPainter * p, QgsRect * viewExtent, QgsMapToPixel * th
767767
void QgsVectorLayer::draw(QPainter * p, QgsRect * viewExtent, QgsMapToPixel * theMapToPixelTransform,
768768
double widthScale, double symbolScale)
769769
{
770-
if ( /*1 == 1 */ m_renderer)
770+
if(m_renderer)
771771
{
772772
// painter is active (begin has been called
773773
/* Steps to draw the layer
@@ -783,33 +783,23 @@ void QgsVectorLayer::draw(QPainter * p, QgsRect * viewExtent, QgsMapToPixel * th
783783
/*Scale factor of the marker image*/
784784
double markerScaleFactor=1.;
785785

786-
// select the records in the extent. The provider sets a spatial filter
787-
// and sets up the selection set for retrieval
788-
QgsDebugMsg("Selecting features based on view extent");
789-
dataProvider->reset();
790-
791786
// Destroy all cached geometries and clear the references to them
792-
QgsDebugMsg("QgsVectorLayer::draw: Destroying all cached geometries.");
793-
794-
// TODO: This area has suspect memory management
795-
//if(mEditable)
796-
//{
797-
for (std::map<int, QgsGeometry*>::iterator it = mCachedGeometries.begin();
798-
it != mCachedGeometries.end();
799-
++it )
787+
788+
if(mEditable)
789+
{
790+
// Destroy all cached geometries and clear the references to them
791+
for (std::map<int, QgsGeometry*>::iterator it = mCachedGeometries.begin(); it != mCachedGeometries.end(); ++it )
800792
{
801793
delete (*it).second;
802794
}
803-
QgsDebugMsg("QgsVectorLayer::draw: Clearing all cached geometries.");
804795
mCachedGeometries.clear();
805-
//}
796+
}
806797

798+
dataProvider->reset();
807799
dataProvider->select(viewExtent);
808800
dataProvider->updateFeatureCount();
809801
int totalFeatures = dataProvider->featureCount();
810802
int featureCount = 0;
811-
// QgsFeature *ftest = dataProvider->getFirstFeature();
812-
QgsDebugMsg("Starting draw of features");
813803
QgsFeature *fet;
814804

815805
bool projectionsEnabledFlag = projectionsEnabled();
@@ -825,7 +815,6 @@ void QgsVectorLayer::draw(QPainter * p, QgsRect * viewExtent, QgsMapToPixel * th
825815
try
826816
{
827817
while (fet = dataProvider->getNextFeature(attributes, updateThreshold))
828-
// while((fet = dataProvider->getNextFeature(attributes)))
829818
{
830819
// XXX Something in our draw event is triggering an additional draw event when resizing [TE 01/26/06]
831820
// XXX Calling this will begin processing the next draw event causing image havoc and recursion crashes.
@@ -841,69 +830,53 @@ void QgsVectorLayer::draw(QPainter * p, QgsRect * viewExtent, QgsMapToPixel * th
841830
}
842831

843832
if (fet == 0)
844-
{
845-
QgsDebugMsg("get next feature returned null");
846-
}
847-
else
848-
{
849-
// Cache this for the use of (e.g.) modifying the feature's geometry.
850-
// mCachedGeometries[fet->featureId()] = fet->geometryAndOwnership();
851-
852-
if (mDeleted.find(fet->featureId())==mDeleted.end())
853-
{
854-
// not deleted.
855-
856-
// check to see if the feature has an uncommitted modification.
857-
// if so, substitute the modified geometry
858-
859-
//#ifdef QGISDEBUG
860-
// std::cerr << "QgsVectorLayer::draw: Looking for modified geometry for " << fet->featureId() << std::endl;
861-
//#endif
862-
if (mChangedGeometries.find(fet->featureId()) != mChangedGeometries.end())
833+
{
834+
QgsDebugMsg("get next feature returned null");
835+
continue;
836+
}
837+
838+
if(mEditable)
839+
{
840+
if (mDeleted.find(fet->featureId()) != mDeleted.end())
841+
{
842+
continue; //dont't draw feature marked as deleted
843+
}
844+
if (mChangedGeometries.find(fet->featureId()) != mChangedGeometries.end())
863845
{
864-
#ifdef QGISDEBUG
865-
std::cerr << "QgsVectorLayer::draw: Found modified geometry for " << fet->featureId() << std::endl;
866-
#endif
867-
// substitute the modified geometry for the committed version
868-
fet->setGeometry( mChangedGeometries[ fet->featureId() ] );
869-
}
870-
871-
// Cache this for the use of (e.g.) modifying the feature's uncommitted geometry.
872-
//if(mEditable)
873-
//{
874-
mCachedGeometries[fet->featureId()] = fet->geometryAndOwnership();
875-
//}
876-
bool sel=mSelected.find(fet->featureId()) != mSelected.end();
877-
m_renderer->renderFeature(p, fet, &marker, &markerScaleFactor,
878-
sel, widthScale );
879-
880-
double scale = markerScaleFactor * symbolScale;
881-
drawFeature(p,fet,theMapToPixelTransform,&marker, scale,
882-
projectionsEnabledFlag);
883-
884-
++featureCount;
885-
delete fet;
886-
}
887-
}
888-
889-
}
846+
// substitute the committed geometry with the modified one
847+
fet->setGeometry( mChangedGeometries[ fet->featureId() ] );
848+
}
849+
// Cache this for the use of (e.g.) modifying the feature's uncommitted geometry.
850+
mCachedGeometries[fet->featureId()] = fet->geometryAndOwnership();
851+
}
852+
853+
//check if feature is selected
854+
bool sel=mSelected.find(fet->featureId()) != mSelected.end();
855+
m_renderer->renderFeature(p, fet, &marker, &markerScaleFactor, sel, widthScale );
856+
double scale = markerScaleFactor * symbolScale;
857+
drawFeature(p,fet,theMapToPixelTransform,&marker, scale, projectionsEnabledFlag);
858+
++featureCount;
859+
delete fet;
860+
}
890861

891862
//also draw the not yet commited features
892-
std::vector<QgsFeature*>::iterator it = mAddedFeatures.begin();
893-
for(; it != mAddedFeatures.end(); ++it)
894-
{
895-
bool sel=mSelected.find((*it)->featureId()) != mSelected.end();
896-
m_renderer->renderFeature(p, *it, &marker, &markerScaleFactor,
897-
sel, widthScale);
898-
double scale = markerScaleFactor * symbolScale;
899-
if (mChangedGeometries.find((*it)->featureId()) != mChangedGeometries.end())
900-
{
901-
(*it)->setGeometry( mChangedGeometries[(*it)->featureId() ] );
902-
}
903-
mCachedGeometries[(*it)->featureId()] = (*it)->geometryAndOwnership();
904-
drawFeature(p,*it,theMapToPixelTransform,&marker,scale,
905-
projectionsEnabledFlag);
906-
}
863+
if(mEditable)
864+
{
865+
for(std::vector<QgsFeature*>::iterator it = mAddedFeatures.begin(); it != mAddedFeatures.end(); ++it)
866+
{
867+
bool sel=mSelected.find((*it)->featureId()) != mSelected.end();
868+
m_renderer->renderFeature(p, *it, &marker, &markerScaleFactor, sel, widthScale);
869+
double scale = markerScaleFactor * symbolScale;
870+
if (mChangedGeometries.find((*it)->featureId()) != mChangedGeometries.end())
871+
{
872+
(*it)->setGeometry( mChangedGeometries[(*it)->featureId() ] );
873+
}
874+
//give a deep copy of the geometry to mCachedGeometry because it will be erased at each redraw
875+
QgsGeometry* deepCopy = new QgsGeometry(*((*it)->geometry()));
876+
mCachedGeometries.insert(std::make_pair((*it)->featureId(), deepCopy));
877+
drawFeature(p,*it,theMapToPixelTransform,&marker,scale, projectionsEnabledFlag);
878+
}
879+
}
907880
}
908881
catch (QgsCsException &cse)
909882
{
@@ -1614,21 +1587,6 @@ bool QgsVectorLayer::addFeature(QgsFeature* f, bool alsoUpdateExtent)
16141587
int end=endian();
16151588
memcpy(f->getGeometry(),&end,1);
16161589

1617-
/* //assign a temporary id to the feature
1618-
int tempid;
1619-
if(mAddedFeatures.size()==0)
1620-
{
1621-
tempid=findFreeId();
1622-
}
1623-
else
1624-
{
1625-
std::list<QgsFeature*>::const_reverse_iterator rit=mAddedFeatures.rbegin();
1626-
tempid=(*rit)->featureId()+1;
1627-
}
1628-
#ifdef QGISDEBUG
1629-
qWarning("assigned feature id "+QString::number(tempid));
1630-
#endif*/
1631-
16321590
//assign a temporary id to the feature (use negative numbers)
16331591
addedIdLowWaterMark--;
16341592

@@ -1644,9 +1602,7 @@ qWarning("assigned feature id "+QString::number(tempid));
16441602
#ifdef QGISDEBUG
16451603
std::cout << "QgsVectorLayer::addFeature: about to traverse fields." << std::endl;
16461604
#endif
1647-
for (std::map<int, QString>::iterator it = fields.begin();
1648-
it != fields.end();
1649-
++it)
1605+
for (std::map<int, QString>::iterator it = fields.begin(); it != fields.end(); ++it)
16501606
{
16511607
#ifdef QGISDEBUG
16521608
std::cout << "QgsVectorLayer::addFeature: inspecting field '"
@@ -1682,37 +1638,27 @@ qWarning("assigned feature id "+QString::number(tempid));
16821638
}
16831639

16841640

1685-
bool QgsVectorLayer::insertVertexBefore(double x, double y, int atFeatureId,
1686-
QgsGeometryVertexIndex beforeVertex)
1641+
bool QgsVectorLayer::insertVertexBefore(double x, double y, int atFeatureId, QgsGeometryVertexIndex beforeVertex)
16871642
{
1643+
if(!mEditable)
1644+
{
1645+
return false;
1646+
}
16881647

1689-
#ifdef QGISDEBUG
1690-
std::cout << "QgsVectorLayer::insertVertexBefore: entered with featureId " << atFeatureId << "." << std::endl;
1691-
#endif
1692-
1693-
if (dataProvider)
1648+
if(dataProvider)
16941649
{
1695-
1696-
if ( mChangedGeometries.find(atFeatureId) == mChangedGeometries.end() )
1650+
if(mChangedGeometries.find(atFeatureId) == mChangedGeometries.end())
16971651
{
1698-
// first time this geometry has changed since last commit
1699-
1652+
//first time this geometry has changed since last commit
1653+
if(!mCachedGeometries[atFeatureId])
1654+
{
1655+
return false;
1656+
}
17001657
mChangedGeometries[atFeatureId] = *(mCachedGeometries[atFeatureId]);
1701-
#ifdef QGISDEBUG
1702-
std::cout << "QgsVectorLayer::insertVertexBefore: first uncommitted change for this geometry." << std::endl;
1703-
#endif
17041658
}
1705-
1659+
17061660
mChangedGeometries[atFeatureId].insertVertexBefore(x, y, beforeVertex);
1707-
17081661
mModified=true;
1709-
1710-
// TODO - refresh map here?
1711-
1712-
#ifdef QGISDEBUG
1713-
// TODO
1714-
#endif
1715-
17161662
return true;
17171663
}
17181664
return false;
@@ -1722,35 +1668,25 @@ bool QgsVectorLayer::insertVertexBefore(double x, double y, int atFeatureId,
17221668
bool QgsVectorLayer::moveVertexAt(double x, double y, int atFeatureId,
17231669
QgsGeometryVertexIndex atVertex)
17241670
{
1725-
//TODO
1726-
1727-
#ifdef QGISDEBUG
1728-
std::cout << "QgsVectorLayer::moveVertexAt: entered with featureId " << atFeatureId << "." << std::endl;
1729-
#endif
1671+
if(!mEditable)
1672+
{
1673+
return false;
1674+
}
17301675

1731-
if (dataProvider)
1676+
if(dataProvider)
17321677
{
1733-
1734-
if ( mChangedGeometries.find(atFeatureId) == mChangedGeometries.end() )
1678+
if(mChangedGeometries.find(atFeatureId) == mChangedGeometries.end())
17351679
{
17361680
// first time this geometry has changed since last commit
1737-
1681+
if(!mCachedGeometries[atFeatureId])
1682+
{
1683+
return false;
1684+
}
17381685
mChangedGeometries[atFeatureId] = *(mCachedGeometries[atFeatureId]);
1739-
#ifdef QGISDEBUG
1740-
std::cout << "QgsVectorLayer::moveVertexAt: first uncommitted change for this geometry." << std::endl;
1741-
#endif
17421686
}
17431687

17441688
mChangedGeometries[atFeatureId].moveVertexAt(x, y, atVertex);
1745-
17461689
mModified=true;
1747-
1748-
// TODO - refresh map here?
1749-
1750-
#ifdef QGISDEBUG
1751-
// TODO
1752-
#endif
1753-
17541690
return true;
17551691
}
17561692
return false;
@@ -1760,36 +1696,25 @@ bool QgsVectorLayer::moveVertexAt(double x, double y, int atFeatureId,
17601696
bool QgsVectorLayer::deleteVertexAt(int atFeatureId,
17611697
QgsGeometryVertexIndex atVertex)
17621698
{
1763-
//TODO
1764-
1765-
#ifdef QGISDEBUG
1766-
std::cout << "QgsVectorLayer::deleteVertexAt: entered with featureId " << atFeatureId << "." << std::endl;
1767-
#endif
1699+
if(!mEditable)
1700+
{
1701+
return false;
1702+
}
17681703

1769-
if (dataProvider)
1704+
if(dataProvider)
17701705
{
1771-
1772-
if ( mChangedGeometries.find(atFeatureId) == mChangedGeometries.end() )
1706+
if(mChangedGeometries.find(atFeatureId) == mChangedGeometries.end())
17731707
{
17741708
// first time this geometry has changed since last commit
1775-
1709+
if(!mCachedGeometries[atFeatureId])
1710+
{
1711+
return false;
1712+
}
17761713
mChangedGeometries[atFeatureId] = *(mCachedGeometries[atFeatureId]);
1777-
#ifdef QGISDEBUG
1778-
std::cout << "QgsVectorLayer::deleteVertexAt: first uncommitted change for this geometry." << std::endl;
1779-
#endif
17801714
}
17811715

1782-
// TODO: Hanlde if we delete the only remaining meaningful vertex of a geometry
17831716
mChangedGeometries[atFeatureId].deleteVertexAt(atVertex);
1784-
17851717
mModified=true;
1786-
1787-
// TODO - refresh map here?
1788-
1789-
#ifdef QGISDEBUG
1790-
// TODO
1791-
#endif
1792-
17931718
return true;
17941719
}
17951720
return false;
@@ -1834,11 +1759,10 @@ bool QgsVectorLayer::deleteSelectedFeatures()
18341759
break;
18351760
}
18361761
}
1837-
if(notcommitedfeature)
1762+
if(!notcommitedfeature)
18381763
{
1839-
break;
1764+
mDeleted.insert(*it);
18401765
}
1841-
mDeleted.insert(*it);
18421766
}
18431767

18441768
if(mSelected.size()>0)
@@ -2894,26 +2818,18 @@ bool QgsVectorLayer::snapPoint(QgsPoint& point, double tolerance)
28942818
}
28952819

28962820

2897-
bool QgsVectorLayer::snapVertexWithContext(QgsPoint& point,
2898-
QgsGeometryVertexIndex& atVertex,
2899-
int& snappedFeatureId,
2900-
QgsGeometry& snappedGeometry,
2901-
double tolerance)
2821+
bool QgsVectorLayer::snapVertexWithContext(QgsPoint& point, QgsGeometryVertexIndex& atVertex, int& snappedFeatureId,\
2822+
QgsGeometry& snappedGeometry, double tolerance)
29022823
{
29032824
bool vertexFound = false; //flag to check if a meaningful result can be returned
29042825
QgsGeometryVertexIndex atVertexTemp;
29052826

29062827
QgsPoint origPoint = point;
29072828

29082829
// Sanity checking
2909-
if ( tolerance<=0 ||
2910-
!dataProvider)
2830+
if ( tolerance<=0 || !dataProvider)
29112831
{
2912-
// set some default values before we bail
2913-
atVertex = QgsGeometryVertexIndex();
2914-
snappedFeatureId = std::numeric_limits<int>::min();
2915-
snappedGeometry = QgsGeometry();
2916-
return FALSE;
2832+
return false;
29172833
}
29182834

29192835
QgsFeature* feature;
@@ -2922,28 +2838,21 @@ bool QgsVectorLayer::snapVertexWithContext(QgsPoint& point,
29222838

29232839
double minSqrDist = tolerance*tolerance; //current minimum distance
29242840

2925-
QgsRect selectrect(point.x()-tolerance, point.y()-tolerance,
2926-
point.x()+tolerance, point.y()+tolerance);
2927-
2841+
QgsRect selectrect(point.x()-tolerance, point.y()-tolerance, point.x()+tolerance, point.y()+tolerance);
29282842
dataProvider->reset();
29292843
dataProvider->select(&selectrect);
29302844

2931-
origPoint = point;
2932-
29332845
// Go through the committed features
29342846
while ((feature = dataProvider->getNextFeature(false)))
29352847
{
2936-
if (mChangedGeometries.find(feature->featureId()) != mChangedGeometries.end())
2848+
if(mChangedGeometries.find(feature->featureId()) != mChangedGeometries.end())
29372849
{
2938-
#ifdef QGISDEBUG
2939-
std::cerr << "QgsVectorLayer::snapSegmentWithContext: Found modified geometry for " << feature->featureId() << std::endl;
2940-
#endif
29412850
// substitute the modified geometry for the committed version
2942-
feature->setGeometry( mChangedGeometries[ feature->featureId() ] );
2851+
feature->setGeometry(mChangedGeometries[feature->featureId()]);
29432852
}
29442853

29452854
minDistSegPoint = feature->geometry()->closestVertex(origPoint, atVertexTemp, testSqrDist);
2946-
if (testSqrDist < minSqrDist)
2855+
if(testSqrDist < minSqrDist)
29472856
{
29482857
point = minDistSegPoint;
29492858
minSqrDist = testSqrDist;
@@ -2953,21 +2862,22 @@ bool QgsVectorLayer::snapVertexWithContext(QgsPoint& point,
29532862
snappedGeometry = *(feature->geometry());
29542863
vertexFound = true;
29552864
}
2865+
delete feature;
29562866
}
29572867

2958-
2959-
#ifdef QGISDEBUG
2960-
std::cout << "QgsVectorLayer::snapVertexWithContext: Checking new features."
2961-
<< "." << std::endl;
2962-
#endif
2963-
29642868
// Also go through the new features
2965-
for (std::vector<QgsFeature*>::iterator iter = mAddedFeatures.begin();
2966-
iter != mAddedFeatures.end();
2967-
++iter)
2869+
for (std::vector<QgsFeature*>::iterator iter = mAddedFeatures.begin(); iter != mAddedFeatures.end(); ++iter)
29682870
{
2969-
minDistSegPoint = (*iter)->geometry()->closestVertex(origPoint, atVertexTemp, testSqrDist);
2970-
if (testSqrDist < minSqrDist)
2871+
if(mChangedGeometries.find((*iter)->featureId()) != mChangedGeometries.end())
2872+
{
2873+
//use the modified geometry
2874+
minDistSegPoint = mChangedGeometries[(*iter)->featureId()].closestVertex(origPoint, atVertexTemp, testSqrDist);
2875+
}
2876+
else
2877+
{
2878+
minDistSegPoint = (*iter)->geometry()->closestVertex(origPoint, atVertexTemp, testSqrDist);
2879+
}
2880+
if(testSqrDist < minSqrDist)
29712881
{
29722882
point = minDistSegPoint;
29732883
minSqrDist = testSqrDist;
@@ -2979,95 +2889,47 @@ bool QgsVectorLayer::snapVertexWithContext(QgsPoint& point,
29792889
}
29802890
}
29812891

2982-
#ifdef QGISDEBUG
2983-
std::cout << "QgsVectorLayer::snapVertexWithContext: Finishing"
2984-
<< " with feature " << snappedFeatureId
2985-
// << " and beforeVertex " << beforeVertex
2986-
<< "." << std::endl;
2987-
#endif
2988-
29892892
if(!vertexFound)
2990-
{
2991-
// set some default values before we bail
2992-
atVertex = QgsGeometryVertexIndex();
2993-
snappedFeatureId = std::numeric_limits<int>::min();
2994-
snappedGeometry = QgsGeometry();
2995-
return FALSE;
2996-
}
2997-
2998-
return TRUE;
2893+
{
2894+
return false;
2895+
}
2896+
return true;
29992897
}
30002898

30012899

3002-
bool QgsVectorLayer::snapSegmentWithContext(QgsPoint& point,
3003-
QgsGeometryVertexIndex& beforeVertex,
3004-
int& snappedFeatureId,
3005-
QgsGeometry& snappedGeometry,
3006-
double tolerance)
2900+
bool QgsVectorLayer::snapSegmentWithContext(QgsPoint& point, QgsGeometryVertexIndex& beforeVertex, int& snappedFeatureId,\
2901+
QgsGeometry& snappedGeometry, double tolerance)
30072902
{
30082903
bool segmentFound = false; //flag to check if a reasonable result can be returned
30092904
QgsGeometryVertexIndex beforeVertexTemp;
30102905

30112906
QgsPoint origPoint = point;
30122907

3013-
#ifdef QGISDEBUG
3014-
std::cout << "QgsVectorLayer::snapSegmentWithContext: Entering."
3015-
<< "." << std::endl;
3016-
#endif
3017-
3018-
#ifdef QGISDEBUG
3019-
std::cout << "QgsVectorLayer::snapSegmentWithContext: Tolerance: " << tolerance << ", dataProvider = '" << dataProvider
3020-
<< "'." << std::endl;
3021-
#endif
3022-
30232908
// Sanity checking
3024-
if ( tolerance<=0 ||
3025-
!dataProvider)
2909+
if ( tolerance<=0 || !dataProvider)
30262910
{
3027-
// set some default values before we bail
3028-
beforeVertex = QgsGeometryVertexIndex();
3029-
snappedFeatureId = std::numeric_limits<int>::min();
3030-
snappedGeometry = QgsGeometry();
3031-
return FALSE;
2911+
return false;
30322912
}
30332913

30342914
QgsFeature* feature;
30352915
QgsPoint minDistSegPoint; // the closest point on the segment
30362916
double testSqrDist; // the squared distance between 'point' and 'snappedFeature'
3037-
30382917
double minSqrDist = tolerance*tolerance; //current minimum distance
30392918

3040-
QgsRect selectrect(point.x()-tolerance, point.y()-tolerance,
3041-
point.x()+tolerance, point.y()+tolerance);
3042-
2919+
QgsRect selectrect(point.x()-tolerance, point.y()-tolerance, point.x()+tolerance, point.y()+tolerance);
30432920
dataProvider->reset();
30442921
dataProvider->select(&selectrect);
30452922

3046-
#ifdef QGISDEBUG
3047-
std::cout << "QgsVectorLayer::snapSegmentWithContext: Checking committed features."
3048-
<< "." << std::endl;
3049-
#endif
3050-
30512923
// Go through the committed features
30522924
while ((feature = dataProvider->getNextFeature(false)))
30532925
{
3054-
30552926
if (mChangedGeometries.find(feature->featureId()) != mChangedGeometries.end())
30562927
{
3057-
#ifdef QGISDEBUG
3058-
std::cerr << "QgsVectorLayer::snapSegmentWithContext: Found modified geometry for " << feature->featureId() << std::endl;
3059-
#endif
30602928
// substitute the modified geometry for the committed version
30612929
feature->setGeometry( mChangedGeometries[ feature->featureId() ] );
30622930
}
30632931

3064-
minDistSegPoint = feature->geometry()->closestSegmentWithContext(origPoint,
3065-
beforeVertexTemp,
3066-
testSqrDist);
3067-
3068-
#ifdef QGISDEBUG
3069-
qWarning(beforeVertexTemp.toString());
3070-
#endif
2932+
minDistSegPoint = feature->geometry()->closestSegmentWithContext(origPoint, beforeVertexTemp, testSqrDist);
30712933

30722934
if (testSqrDist < minSqrDist)
30732935
{
@@ -3078,30 +2940,22 @@ bool QgsVectorLayer::snapSegmentWithContext(QgsPoint& point,
30782940
snappedFeatureId = feature->featureId();
30792941
snappedGeometry = *(feature->geometry());
30802942
segmentFound = true;
3081-
3082-
#ifdef QGISDEBUG
3083-
std::cout << "QgsVectorLayer::snapSegmentWithContext: minSqrDist reduced to: " << minSqrDist
3084-
// << " and beforeVertex " << beforeVertex
3085-
<< "." << std::endl;
3086-
#endif
3087-
30882943
}
2944+
delete feature;
30892945
}
30902946

3091-
3092-
#ifdef QGISDEBUG
3093-
std::cout << "QgsVectorLayer::snapSegmentWithContext: Checking new features."
3094-
<< "." << std::endl;
3095-
#endif
3096-
30972947
// Also go through the new features
3098-
for (std::vector<QgsFeature*>::iterator iter = mAddedFeatures.begin();
3099-
iter != mAddedFeatures.end();
3100-
++iter)
2948+
for (std::vector<QgsFeature*>::iterator iter = mAddedFeatures.begin(); iter != mAddedFeatures.end(); ++iter)
31012949
{
3102-
minDistSegPoint = (*iter)->geometry()->closestSegmentWithContext(origPoint,
3103-
beforeVertexTemp,
3104-
testSqrDist);
2950+
if(mChangedGeometries.find((*iter)->featureId()) != mChangedGeometries.end())
2951+
{
2952+
//use the modified geometry
2953+
minDistSegPoint = mChangedGeometries[(*iter)->featureId()].closestSegmentWithContext(origPoint, beforeVertexTemp, testSqrDist);
2954+
}
2955+
else
2956+
{
2957+
minDistSegPoint = (*iter)->geometry()->closestSegmentWithContext(origPoint, beforeVertexTemp, testSqrDist);
2958+
}
31052959

31062960
if (testSqrDist < minSqrDist)
31072961
{
@@ -3115,24 +2969,11 @@ bool QgsVectorLayer::snapSegmentWithContext(QgsPoint& point,
31152969
}
31162970
}
31172971

3118-
#ifdef QGISDEBUG
3119-
std::cout << "QgsVectorLayer::snapSegmentWithContext: Finishing"
3120-
<< " with feature " << snappedFeatureId
3121-
// << " and beforeVertex " << beforeVertex
3122-
<< "." << std::endl;
3123-
#endif
3124-
31252972
if(!segmentFound)
31262973
{
3127-
// set some default values before we bail
3128-
beforeVertex = QgsGeometryVertexIndex();
3129-
snappedFeatureId = std::numeric_limits<int>::min();
3130-
snappedGeometry = QgsGeometry();
3131-
return FALSE;
2974+
return false;
31322975
}
3133-
3134-
return TRUE;
3135-
2976+
return true;
31362977
}
31372978

31382979

0 commit comments

Comments
 (0)
Please sign in to comment.