Skip to content

Commit

Permalink
[tracing curves] add supports curve flag
Browse files Browse the repository at this point in the history
  • Loading branch information
olivierdalang committed May 12, 2020
1 parent ac9752c commit 5d2e79e
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 6 deletions.
5 changes: 5 additions & 0 deletions src/app/qgsmaptooladdpart.cpp
Expand Up @@ -35,6 +35,11 @@ QgsMapToolAddPart::QgsMapToolAddPart( QgsMapCanvas *canvas )
connect( QgisApp::instance(), &QgisApp::projectRead, this, &QgsMapToolAddPart::stopCapturing );
}

QgsMapToolCapture::Capabilities QgsMapToolAddPart::capabilities() const
{
return QgsMapToolCapture::SupportsCurves;
}

void QgsMapToolAddPart::canvasReleaseEvent( QgsMapMouseEvent *e )
{
if ( checkSelection() )
Expand Down
2 changes: 2 additions & 0 deletions src/app/qgsmaptooladdpart.h
Expand Up @@ -23,6 +23,8 @@ class APP_EXPORT QgsMapToolAddPart : public QgsMapToolCapture
public:
QgsMapToolAddPart( QgsMapCanvas *canvas );

QgsMapToolCapture::Capabilities capabilities() const override;

void canvasReleaseEvent( QgsMapMouseEvent *e ) override;
void cadCanvasReleaseEvent( QgsMapMouseEvent *e ) override;

Expand Down
21 changes: 15 additions & 6 deletions src/gui/qgsmaptoolcapture.cpp
Expand Up @@ -66,6 +66,11 @@ QgsMapToolCapture::~QgsMapToolCapture()
}
}

QgsMapToolCapture::Capabilities QgsMapToolCapture::capabilities() const
{
return QgsMapToolCapture::NoCapabilities;
}

void QgsMapToolCapture::activate()
{
if ( mTempRubberBand )
Expand Down Expand Up @@ -289,14 +294,18 @@ bool QgsMapToolCapture::tracingAddVertex( const QgsPointXY &point )
mSnappingMatches.append( QgsPointLocator::Match() );
}

// If the layer supports curves, we de-approximate curves
// Curves de-approximation
QgsSettings settings;
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mCanvas->currentLayer() );
if ( vlayer->dataProvider()->capabilities().testFlag( QgsVectorDataProvider::Capability::CircularGeometries ) && settings.value( QStringLiteral( "/qgis/digitizing/convert_to_curve" ), false ).toBool() )
if ( settings.value( QStringLiteral( "/qgis/digitizing/convert_to_curve" ), false ).toBool() )
{
QgsGeometry linear = QgsGeometry( mCaptureCurve.segmentize() );
QgsGeometry curved = linear.convertToCurves();
mCaptureCurve = *qgsgeometry_cast<QgsCompoundCurve *>( curved.constGet() );
// If the tool and the layer support curves
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mCanvas->currentLayer() );
if ( capabilities().testFlag( QgsMapToolCapture::Capability::SupportsCurves ) && vlayer->dataProvider()->capabilities().testFlag( QgsVectorDataProvider::Capability::CircularGeometries ) )
{
QgsGeometry linear = QgsGeometry( mCaptureCurve.segmentize() );
QgsGeometry curved = linear.convertToCurves();
mCaptureCurve = *qgsgeometry_cast<QgsCompoundCurve *>( curved.constGet() );
}
}

tracer->reportError( QgsTracer::ErrNone, true ); // clear messagebar if there was any error
Expand Down
15 changes: 15 additions & 0 deletions src/gui/qgsmaptoolcapture.h
Expand Up @@ -52,11 +52,24 @@ class GUI_EXPORT QgsMapToolCapture : public QgsMapToolAdvancedDigitizing
CapturePolygon //!< Capture polygons
};

enum Capability
{
NoCapabilities = 0, //!< Tool has no capabilities
SupportsCurves = 1, //!< Supports curved geometries input;
};

Q_DECLARE_FLAGS( Capabilities, Capability )

//! constructor
QgsMapToolCapture( QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget, CaptureMode mode );

~QgsMapToolCapture() override;

/**
* Returns flags containing the supported capabilities
*/
virtual QgsMapToolCapture::Capabilities capabilities() const;

void activate() override;
void deactivate() override;

Expand Down Expand Up @@ -314,4 +327,6 @@ class GUI_EXPORT QgsMapToolCapture : public QgsMapToolAdvancedDigitizing

};

Q_DECLARE_OPERATORS_FOR_FLAGS( QgsMapToolCapture::Capabilities )

#endif
5 changes: 5 additions & 0 deletions src/gui/qgsmaptooldigitizefeature.cpp
Expand Up @@ -43,6 +43,11 @@ QgsMapToolDigitizeFeature::QgsMapToolDigitizeFeature( QgsMapCanvas *canvas, QgsA
connect( QgsProject::instance(), &QgsProject::readProject, this, &QgsMapToolDigitizeFeature::stopCapturing );
}

QgsMapToolCapture::Capabilities QgsMapToolDigitizeFeature::capabilities() const
{
return QgsMapToolCapture::SupportsCurves;
}

void QgsMapToolDigitizeFeature::digitized( const QgsFeature &f )
{
emit digitizingCompleted( f );
Expand Down
2 changes: 2 additions & 0 deletions src/gui/qgsmaptooldigitizefeature.h
Expand Up @@ -42,6 +42,8 @@ class GUI_EXPORT QgsMapToolDigitizeFeature : public QgsMapToolCapture
*/
QgsMapToolDigitizeFeature( QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget, CaptureMode mode = QgsMapToolCapture::CaptureNone );

QgsMapToolCapture::Capabilities capabilities() const override;

void cadCanvasReleaseEvent( QgsMapMouseEvent *e ) override;

/**
Expand Down

0 comments on commit 5d2e79e

Please sign in to comment.