diff --git a/src/app/qgsmaptooladdrectangle.cpp b/src/app/qgsmaptooladdrectangle.cpp index 33a13e1ec7d0..b5c1d3750980 100644 --- a/src/app/qgsmaptooladdrectangle.cpp +++ b/src/app/qgsmaptooladdrectangle.cpp @@ -93,6 +93,7 @@ void QgsMapToolAddRectangle::deactivate( ) } mParentTool->clearCurve( ); + // keep z value from the first snapped point std::unique_ptr lineString( mRectangle.toLineString() ); for ( const QgsPoint &point : qgis::as_const( mPoints ) ) diff --git a/src/app/qgsmaptoolrectangle3points.cpp b/src/app/qgsmaptoolrectangle3points.cpp index cbc34c6fc497..70e1008a4869 100644 --- a/src/app/qgsmaptoolrectangle3points.cpp +++ b/src/app/qgsmaptoolrectangle3points.cpp @@ -46,8 +46,14 @@ void QgsMapToolRectangle3Points::cadCanvasReleaseEvent( QgsMapMouseEvent *e ) if ( e->button() == Qt::LeftButton ) { - if ( !point.is3D() ) + bool is3D = false; + QgsVectorLayer *currentLayer = qobject_cast( mCanvas->currentLayer() ); + if ( currentLayer ) + is3D = QgsWkbTypes::hasZ( currentLayer->wkbType() ); + + if ( is3D && !point.is3D() ) point.addZValue( defaultZValue() ); + if ( mPoints.size() < 2 ) { mPoints.append( point ); @@ -86,12 +92,18 @@ void QgsMapToolRectangle3Points::cadCanvasMoveEvent( QgsMapMouseEvent *e ) line->addVertex( mPoints.at( 0 ) ); line->addVertex( point ); mTempRubberBand->setGeometry( line.release() ); - break; } + break; case 2: { - if ( !point.is3D() ) + bool is3D = false; + QgsVectorLayer *currentLayer = qobject_cast( mCanvas->currentLayer() ); + if ( currentLayer ) + is3D = QgsWkbTypes::hasZ( currentLayer->wkbType() ); + + if ( is3D && !point.is3D() ) point.addZValue( defaultZValue() ); + switch ( mCreateMode ) { case DistanceMode: @@ -101,10 +113,11 @@ void QgsMapToolRectangle3Points::cadCanvasMoveEvent( QgsMapMouseEvent *e ) mRectangle = QgsQuadrilateral::rectangleFrom3Points( mPoints.at( 0 ), mPoints.at( 1 ), point, QgsQuadrilateral::Projected ); break; } - - mTempRubberBand->setGeometry( mRectangle.toPolygon() ); - break; + mTempRubberBand->setGeometry( mRectangle.toPolygon( ) ); } + break; + default: + break; } } }