32#include "moc_qgsmaptooladvanceddigitizing.cpp"
34using namespace Qt::StringLiterals;
52 if ( !e->isAccepted() )
63 if ( mSnapToLayerGridEnabled &&
layer )
76 if ( !e->isAccepted() )
87 if ( mSnapToGridCanvasItem && mSnapToLayerGridEnabled &&
layer )
101 if ( !e->isAccepted() )
112 if ( mSnapToGridCanvasItem && mSnapToLayerGridEnabled &&
layer )
115 mSnapToGridCanvasItem->setPoint( e->
mapPoint() );
118 if ( mSnapIndicator )
137 mSnapToGridCanvasItem->setPrecision(
currentVectorLayer()->geometryOptions()->geometryPrecision() );
139 mSnapToGridCanvasItem->setEnabled( mSnapToLayerGridEnabled );
148 delete mSnapToGridCanvasItem;
149 mSnapToGridCanvasItem =
nullptr;
151 if ( mSnapIndicator )
162 return static_cast<bool>( mSnapIndicator.get() );
171 QString &totalLengthString
174 areaString = QString();
175 totalLengthString = QString();
190 std::unique_ptr< QgsDistanceArea > distanceArea;
191 auto createDistanceArea = [destinationCrs, &distanceArea] {
196 distanceArea = std::make_unique< QgsDistanceArea >();
216 createDistanceArea();
217 const double area = distanceArea->measureArea( g );
224 switch ( totalLengthType )
236 createDistanceArea();
246 if ( enabled && !mSnapIndicator )
248 mSnapIndicator = std::make_unique<QgsSnapIndicator>(
mCanvas );
250 else if ( !enabled && mSnapIndicator )
252 mSnapIndicator.reset();
256void QgsMapToolAdvancedDigitizing::cadPointChanged(
const QgsPointXY &point )
259 QMouseEvent *ev =
new QMouseEvent( QEvent::MouseMove,
mCanvas->mouseLastXY(), Qt::NoButton, Qt::NoButton, Qt::NoModifier );
260 qApp->postEvent(
mCanvas->viewport(), ev );
263void QgsMapToolAdvancedDigitizing::onCurrentLayerChanged()
265 if ( mSnapToGridCanvasItem )
268 if (
layer && mSnapToLayerGridEnabled )
270 mSnapToGridCanvasItem->setPrecision(
layer->geometryOptions()->geometryPrecision() );
271 mSnapToGridCanvasItem->setCrs(
layer->crs() );
277 mSnapToGridCanvasItem->setEnabled(
false );
282 mSnapToGridCanvasItem->setEnabled( mSnapToLayerGridEnabled );
287void QgsMapToolAdvancedDigitizing::onTransientGeometryChanged(
const QgsReferencedGeometry &geometry )
292 QgsStatusBar *statusBar =
mCanvas ?
mCanvas->statusBar() :
nullptr;
308 QString totalLengthString;
311 QStringList messageParts;
312 if ( !areaString.isEmpty() )
313 messageParts.append( tr(
"Total area: %1" ).arg( areaString ) );
314 if ( !totalLengthString.isEmpty() )
317 messageParts.append( tr(
"Perimeter: %1" ).arg( totalLengthString ) );
319 messageParts.append( tr(
"Total length: %1" ).arg( totalLengthString ) );
322 statusBar->
showMessage( messageParts.join(
' ' ) );
328 return mSnapToLayerGridEnabled;
333 mSnapToLayerGridEnabled = snapToGridEnabled;
335 if ( mSnapToGridCanvasItem )
337 mSnapToGridCanvasItem->setEnabled( snapToGridEnabled );
CadMeasurementDisplayType
Advanced digitizing measurement display types.
@ Hidden
Hide measurement.
@ Cartesian
Use Cartesian measurements.
@ Ellipsoidal
Use Ellipsoidal measurements.
Represents a coordinate reference system (CRS).
Qgis::DistanceUnit mapUnits
Custom exception class for Coordinate Reference System related exceptions.
A geometry is the spatial representation of a feature.
double length() const
Returns the planar, 2-dimensional length of geometry.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
double area() const
Returns the planar, 2-dimensional area of the geometry.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
void currentLayerChanged(QgsMapLayer *layer)
Emitted when the current layer is changed.
QgsMapLayer * currentLayer()
returns current layer (set by legend widget)
Base class for all map layer types.
A mouse event which is the result of a user interaction with a QgsMapCanvas.
QgsPointXY mapPoint() const
mapPoint returns the point in coordinates
QgsPointLocator::Match mapPointMatch() const
Returns the matching data from the most recently snapped point.
void snapToGrid(double precision, const QgsCoordinateReferenceSystem &crs)
Snaps the mapPoint to a grid with the given precision.
QgsPointXY snapPoint()
snapPoint will snap the points using the map canvas snapping utils configuration
static Q_INVOKABLE QString formatAreaForProject(QgsProject *project, double area, Qgis::AreaUnit unit)
Formats an area measurement (with the specified unit) for use with a project, respecting the project'...
static Q_INVOKABLE QString formatDistanceForProject(QgsProject *project, double distance, Qgis::DistanceUnit unit)
Formats a distance measurement (with the specified unit) for use with a project, respecting the proje...
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsCoordinateReferenceSystem crs() const
Returns the associated coordinate reference system, or an invalid CRS if no reference system is set.
A QgsGeometry with associated coordinate reference system.
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
static const QgsSettingsEntryEnumFlag< Qgis::CadMeasurementDisplayType > * settingsDigitizingStatusBarTotalLengthDisplay
Settings entry digitizing status bar perimeter/total length display.
static const QgsSettingsEntryEnumFlag< Qgis::CadMeasurementDisplayType > * settingsDigitizingStatusBarAreaDisplay
Settings entry digitizing status bar area display.
Shows a grid on the map canvas given a spatial resolution.
void clearMessage()
Removes any temporary message being shown.
void showMessage(const QString &message, int timeout=0)
Displays the given message for the specified number of milli-seconds (timeout).
static Q_INVOKABLE Qgis::AreaUnit distanceToAreaUnit(Qgis::DistanceUnit distanceUnit)
Converts a distance unit to its corresponding area unit, e.g., meters to square meters.
Represents a vector layer which manages a vector based dataset.
#define QgsDebugError(str)