2323#include " qgslogger.h"
2424#include " qgsmapcanvas.h"
2525#include " qgsmulticurve.h"
26+ #include " qgsmultipoint.h"
2627#include " qgspointlocator.h"
2728#include " qgsproject.h"
2829#include " qgsrubberband.h"
@@ -116,6 +117,21 @@ static bool isCircularVertex( const QgsGeometry &geom, int vertexIndex )
116117 return geom.vertexIdFromVertexNr ( vertexIndex, vid ) && vid.type == QgsVertexId::CurveVertex;
117118}
118119
120+
121+ // ! Create a multi-point geometry that can be used to highlight vertices of a feature
122+ static QgsGeometry geometryToMultiPoint ( const QgsGeometry &geom )
123+ {
124+ QgsMultiPointV2 *multiPoint = new QgsMultiPointV2 ();
125+ QgsGeometry outputGeom ( multiPoint );
126+ QgsAbstractGeometry *g = geom.geometry ();
127+ for ( int i = 0 ; i < g->partCount (); ++i )
128+ for ( int j = 0 ; j < g->ringCount ( i ); ++j )
129+ for ( int k = 0 ; k < g->vertexCount ( i, j ); ++k )
130+ multiPoint->addGeometry ( new QgsPointV2 ( g->vertexAt ( QgsVertexId ( i, j, k ) ) ) );
131+ return outputGeom;
132+ }
133+
134+
119135//
120136// snapping match filters
121137//
@@ -200,6 +216,12 @@ QgsNodeTool2::QgsNodeTool2( QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidge
200216 mFeatureBand ->setVisible ( false );
201217
202218 QColor color = digitizingStrokeColor ();
219+ mFeatureBandMarkers = new QgsRubberBand ( canvas );
220+ mFeatureBandMarkers ->setIcon ( QgsRubberBand::ICON_CIRCLE );
221+ mFeatureBandMarkers ->setColor ( color );
222+ mFeatureBandMarkers ->setIconSize ( 8 );
223+ mFeatureBandMarkers ->setVisible ( false );
224+
203225 mVertexBand = new QgsRubberBand ( canvas );
204226 mVertexBand ->setIcon ( QgsRubberBand::ICON_CIRCLE );
205227 mVertexBand ->setColor ( color );
@@ -225,6 +247,7 @@ QgsNodeTool2::~QgsNodeTool2()
225247 delete mSnapMarker ;
226248 delete mEdgeCenterMarker ;
227249 delete mFeatureBand ;
250+ delete mFeatureBandMarkers ;
228251 delete mVertexBand ;
229252 delete mEdgeBand ;
230253 delete mEndpointMarker ;
@@ -556,6 +579,7 @@ void QgsNodeTool2::canvasDoubleClickEvent( QgsMapMouseEvent *e )
556579void QgsNodeTool2::removeTemporaryRubberBands ()
557580{
558581 mFeatureBand ->setVisible ( false );
582+ mFeatureBandMarkers ->setVisible ( false );
559583 mFeatureBandLayer = nullptr ;
560584 mFeatureBandFid = QgsFeatureId ();
561585 mVertexBand ->setVisible ( false );
@@ -773,6 +797,8 @@ void QgsNodeTool2::mouseMoveNotDragging( QgsMapMouseEvent *e )
773797 if ( mFeatureBandLayer == m.layer () && mFeatureBandFid == m.featureId () )
774798 return ; // skip regeneration of rubber band if not needed
775799 QgsGeometry geom = cachedGeometry ( m.layer (), m.featureId () );
800+ mFeatureBandMarkers ->setToGeometry ( geometryToMultiPoint ( geom ), m.layer () );
801+ mFeatureBandMarkers ->setVisible ( true );
776802 if ( QgsWkbTypes::isCurvedType ( geom.geometry ()->wkbType () ) )
777803 geom = QgsGeometry ( geom.geometry ()->segmentize () );
778804 mFeatureBand ->setToGeometry ( geom, m.layer () );
@@ -783,6 +809,7 @@ void QgsNodeTool2::mouseMoveNotDragging( QgsMapMouseEvent *e )
783809 else
784810 {
785811 mFeatureBand ->setVisible ( false );
812+ mFeatureBandMarkers ->setVisible ( false );
786813 mFeatureBandLayer = nullptr ;
787814 mFeatureBandFid = QgsFeatureId ();
788815 }
0 commit comments