Hi all,<br><br>I am currently trying to use the snapping capabilities of QGIS, and I face some problems. When I edit a new geometry, I would like to know the vertices which have been snapped.<br>So, I do this as follow, for example with a polyline<br>
<br>void QgsCGALArr2PluginGui::addInArrangement( const QgsPolyline &amp;line )<br>{<br>&nbsp;&nbsp;&nbsp; if ( !m_mapCanvasSnapper )<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_mapCanvasSnapper = new QgsMapCanvasSnapper( m_mapCanvas );<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_mapCanvasSnapper-&gt;setMapCanvas( m_mapCanvas );<br>
&nbsp;&nbsp;&nbsp; // Differenciation des snaps sur sommets et sur segments<br>&nbsp;&nbsp;&nbsp; QMultiMap &lt; double, QgsSnappingResult &gt; snappingVerticesResults, snappingSegmentsResults;<br>&nbsp;&nbsp;&nbsp; QMultiMap &lt; double, QgsSnappingResult &gt; globalSnappingVerticesResults, globalSnappingSegmentsResults;<br>
&nbsp;&nbsp;&nbsp; // On commence par checker que des sommets de la polyligne n&#39;existent pas deja<br>&nbsp;&nbsp;&nbsp; QString text(&quot;&quot;), numericString;<br>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; line.size(); ++i)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; QgsPoint pt = <a href="http://line.at">line.at</a>(i);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // On teste le snap sur chacun de layers<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (unsigned int j = 0;j&lt;m_mapCanvas-&gt;layerCount();++j)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; QgsMapLayer *currentLayer = m_mapCanvas-&gt;layer(j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; QgsVectorLayer *vector = dynamic_cast&lt;QgsVectorLayer *&gt;( currentLayer );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ( vector )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; snappingVerticesResults.clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; snappingSegmentsResults.clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; vector-&gt;snapWithContext( pt , 5. , snappingVerticesResults , QgsSnapper::SnapToVertex );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; vector-&gt;snapWithContext( pt , 5. , snappingSegmentsResults , QgsSnapper::SnapToSegment );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // On ajoute les resultats du layer courant aux resultats globaux<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for ( QMultiMap &lt; double, QgsSnappingResult &gt;::iterator it=snappingVerticesResults.begin();it!=snappingVerticesResults.end();++it)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ( pt != it.value().snappedVertex )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; globalSnappingVerticesResults.insertMulti( it.key() , it.value() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for ( QMultiMap &lt; double, QgsSnappingResult &gt;::iterator it=snappingSegmentsResults.begin();it!=snappingSegmentsResults.end();++it)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; globalSnappingSegmentsResults.insertMulti( it.key() , it.value() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; for ( QMultiMap &lt; double, QgsSnappingResult &gt;::iterator it=globalSnappingVerticesResults.begin();it!=globalSnappingVerticesResults.end();++it)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; text += numericString.setNum(it.key()) + &quot;&nbsp;&nbsp; &quot; + it.value().snappedVertex.toString() + &quot;\n&quot;;<br>&nbsp;&nbsp;&nbsp; text += &quot;globalSnappingVerticesResults = &quot; + numericString.setNum( globalSnappingVerticesResults.size() ) + &quot;\n&quot;;<br>
&nbsp;&nbsp;&nbsp; text += &quot;globalSnappingSegmentsResults = &quot; + numericString.setNum( globalSnappingSegmentsResults.size() ) + &quot;\n&quot;;<br><br>&nbsp;&nbsp;&nbsp; // ...<br>}<br><br>In my project, all layers are &quot;snappable&quot; to vertices and segemnts, with a tolerance of 5, and the units are in meter. That is why my toleance in the snapWithContext is set to 5. The problem is that when I edit the geometry, the snapping works well (the mouse is attracted when close to a vertex or segment), but, the above code shows that snappingVerticesResults is empty. So I do not understand why I cannot retrieve the snapped vertices.<br>
<br>In fact, I simply want to maintain a list of vertices, update it each time a new geometry is added, but, be aware that if the new geometry has a common vertex with an already existing geometry, do not add this vertex to the list of vertices. Could you help ?<br>
<br>Best regards,<br><br>Olivier<br><br>PS: note that I also tried m_mapCanvasSnapper-&gt;snapToCurrentLayer(...) and m_mapCanvasSnapper-&gt;snapToBackgroundLayers(...) without any success.<br clear="all"><br>-- <br>Dr. Olivier Tournaire<br>
MATIS - Institut Géographique National<br>73, Ave de Paris<br>94165 St Mandé cedex, France<br><br>tel: (+33) 1 43 98 80 00 - 71 25<br>fax: (+33) 1 43 98 85 81<br>