QGIS API Documentation 3.41.0-Master (fda2aa46e9a)
Loading...
Searching...
No Matches
qgsadvanceddigitizingdockwidget.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsadvanceddigitizingdockwidget.h - dock for CAD tools
3 ----------------------
4 begin : October 2014
5 copyright : (C) Denis Rouzaud
6 email : denis.rouzaud@gmail.com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#ifndef QGSADVANCEDDIGITIZINGDOCK
17#define QGSADVANCEDDIGITIZINGDOCK
18
19#include <QList>
20#include <QQueue>
21
22#include <memory>
23
24#include "ui_qgsadvanceddigitizingdockwidgetbase.h"
25#include "qgis_gui.h"
26#include "qgis_sip.h"
28#include "qgsdockwidget.h"
29#include "qgsmessagebaritem.h"
30#include "qgspointxy.h"
31#include "qgspointlocator.h"
32#include "qgssnapindicator.h"
33
34
38class QgsMapCanvas;
39class QgsMapTool;
43
51class GUI_EXPORT QgsAdvancedDigitizingDockWidget : public QgsDockWidget, private Ui::QgsAdvancedDigitizingDockWidgetBase
52{
53 Q_OBJECT
54
55 public:
56
63 {
64 AbsoluteAngle = 1,
65 RelativeAngle = 2,
66 RelativeCoordinates = 4,
67 Distance = 8,
68 };
69 Q_DECLARE_FLAGS( CadCapacities, CadCapacity )
70 Q_FLAG( CadCapacities )
71
72
78 {
79 ReturnPressed, FocusOut, TextEdited
80 };
81
82
89 class GUI_EXPORT CadConstraint
90 {
91 public:
92
97 {
100 HardLock
101 };
102
110 CadConstraint( QLineEdit *lineEdit, QToolButton *lockerButton, QToolButton *relativeButton = nullptr, QToolButton *repeatingLockButton = nullptr )
111 : mLineEdit( lineEdit )
112 , mLockerButton( lockerButton )
113 , mRelativeButton( relativeButton )
114 , mRepeatingLockButton( repeatingLockButton )
115 , mLockMode( NoLock )
116 , mRepeatingLock( false )
117 , mRelative( false )
118 , mValue( 0.0 )
119 {}
120
125 LockMode lockMode() const { return mLockMode; }
126
130 bool isLocked() const { return mLockMode != NoLock; }
131
137 bool isRepeatingLock() const { return mRepeatingLock; }
138
142 bool relative() const { return mRelative; }
143
147 double value() const { return mValue; }
148
152 QLineEdit *lineEdit() const { return mLineEdit; }
153
157 void setLockMode( LockMode mode );
158
165 void setRepeatingLock( bool repeating );
166
170 void setRelative( bool relative );
171
177 void setValue( double value, bool updateWidget = true );
178
183 QString displayValue() const;
184
188 void toggleLocked();
189
193 void toggleRelative();
194
201 int precision() const { return mPrecision; }
202
209 void setPrecision( int precision );
210
215 Qgis::CadConstraintType cadConstraintType() const;
216
221 void setCadConstraintType( Qgis::CadConstraintType constraintType );
222
227 void setMapCanvas( QgsMapCanvas *mapCanvas );
228
233 static QString removeSuffix( const QString &text, Qgis::CadConstraintType constraintType );
234
235
236 private:
237 QLineEdit *mLineEdit = nullptr;
238 QToolButton *mLockerButton = nullptr;
239 QToolButton *mRelativeButton = nullptr;
240 QToolButton *mRepeatingLockButton = nullptr;
241 LockMode mLockMode;
242 bool mRepeatingLock;
243 bool mRelative;
244 double mValue;
245 int mPrecision = 6;
247 QgsMapCanvas *mMapCanvas = nullptr;
248 };
249
256 explicit QgsAdvancedDigitizingDockWidget( QgsMapCanvas *canvas, QWidget *parent = nullptr, QgsUserInputWidget *userInputWidget = nullptr );
258
265 bool canvasKeyPressEventFilter( QKeyEvent *e );
266
271 bool applyConstraints( QgsMapMouseEvent *e );
272
278
282 void processCanvasPressEvent( QgsMapMouseEvent *event );
283
287 void processCanvasMoveEvent( QgsMapMouseEvent *event );
288
292 void processCanvasReleaseEvent( QgsMapMouseEvent *event );
293
298 void setTool( QgsAdvancedDigitizingTool *tool );
299
304 QgsAdvancedDigitizingTool *tool() const;
305
310 void releaseLocks( bool releaseRepeatingLocks = true );
311
315 void clear();
316
317 void keyPressEvent( QKeyEvent *e ) override;
318
320 bool cadEnabled() const { return mCadEnabled; }
321
326 void switchZM( );
327
332 void setEnabledZ( bool enable );
333
338 void setEnabledM( bool enable );
339
344 bool constructionMode() const { return mConstructionMode; }
345
350 QgsVectorLayer *constructionGuidesLayer() const { return mConstructionGuidesLayer.get(); }
351
356 bool showConstructionGuides() const;
357
362 bool snapToConstructionGuides() const;
363
368 bool recordConstructionGuides() const;
369
374 Qgis::BetweenLineConstraint betweenLineConstraint() const { return mBetweenLineConstraint; }
376 const CadConstraint *constraintAngle() const { return mAngleConstraint.get(); }
378 const CadConstraint *constraintDistance() const { return mDistanceConstraint.get(); }
380 const CadConstraint *constraintX() const { return mXConstraint.get(); }
382 const CadConstraint *constraintY() const { return mYConstraint.get(); }
383
388 const CadConstraint *constraintZ() const { return mZConstraint.get(); }
389
394 const CadConstraint *constraintM() const { return mMConstraint.get(); }
396 bool commonAngleConstraint() const { return !qgsDoubleNear( mCommonAngleConstraint, 0.0 ); }
397
399 const CadConstraint *constraintLineExtension() const { return mLineExtensionConstraint.get(); }
400
402 Qgis::LineExtensionSide lineExtensionSide() const { return mSoftLockLineExtension; }
403
405 const CadConstraint *constraintXyVertex() const { return mXyVertexConstraint.get(); }
406
408 double softLockX() const { return mSoftLockX; }
409
411 double softLockY() const { return mSoftLockY; }
412
417 void toggleConstraintDistance();
418
423 QgsPointLocator::Match mapPointMatch() const { return mSnapMatch; }
424
429 QList< QgsPointLocator::Match > lockedSnapVertices() const { return mLockedSnapVertices; }
430
436 void clearLockedSnapVertices( bool force = true );
437
441 void clearPoints();
442
446 void addPoint( const QgsPointXY &point );
447
452 void removePreviousPoint();
453
458 void updateCurrentPoint( const QgsPoint &point );
459
466 void setPoints( const QList<QgsPointXY> &points );
467
475 QgsPoint currentPointV2( bool *exists = nullptr ) const;
476
482 QgsPoint currentPointLayerCoordinates( QgsMapLayer *layer ) const;
483
490 Q_DECL_DEPRECATED QgsPointXY currentPoint( bool *exists = nullptr ) const SIP_DEPRECATED { return currentPointV2( exists ); };
491
497 QgsPoint previousPointV2( bool *exists = nullptr ) const;
498
505 Q_DECL_DEPRECATED QgsPointXY previousPoint( bool *exists = nullptr ) const SIP_DEPRECATED { return previousPointV2( exists ); };
506
512 QgsPoint penultimatePointV2( bool *exists = nullptr ) const;
513
520 Q_DECL_DEPRECATED QgsPointXY penultimatePoint( bool *exists = nullptr ) const SIP_DEPRECATED { return penultimatePointV2( exists ); };
521
525 inline int pointsCount() const { return mCadPointList.count(); }
526
530 inline bool snappedToVertex() const { return ( mSnapMatch.isValid() && ( mSnapMatch.hasVertex() || mSnapMatch.hasLineEndpoint() ) ); }
531
535 QList<QgsPointXY> snappedSegment() const { return mSnappedSegment; }
536
538 QAction *enableAction() { return mEnableAction; }
539
546 void enable();
547
551 void disable();
552
556 void updateCadPaintItem();
557
566 void setX( const QString &value, WidgetSetMode mode );
567
576 void setY( const QString &value, WidgetSetMode mode );
577
586 void setZ( const QString &value, WidgetSetMode mode );
587
596 void setM( const QString &value, WidgetSetMode mode );
597
606 void setAngle( const QString &value, WidgetSetMode mode );
607
616 void setDistance( const QString &value, WidgetSetMode mode );
617
622 double getLineZ( ) const;
623
628 double getLineM( ) const;
629
634 CadCapacities capacities() const { return mCapacities; };
635
640 QString formatCommonAngleSnapping( double angle );
641
642 signals:
643
649 void pushWarning( const QString &message );
650
655
663 void pointChangedV2( const QgsPoint &point );
664
672 Q_DECL_DEPRECATED void pointChanged( const QgsPointXY &point ) SIP_DEPRECATED;
673
675
683 void cadEnabledChanged( bool enabled );
684
691 void valueXChanged( const QString &value );
692
699 void valueYChanged( const QString &value );
700
707 void valueZChanged( const QString &value );
708
715 void valueMChanged( const QString &value );
716
723 void valueAngleChanged( const QString &value );
724
731 void valueDistanceChanged( const QString &value );
732
739 void valueBearingChanged( const QString &value );
740
747 void lockXChanged( bool locked );
748
755 void lockYChanged( bool locked );
756
763 void lockZChanged( bool locked );
764
771 void lockMChanged( bool locked );
772
779 void lockAngleChanged( bool locked );
780
787 void lockDistanceChanged( bool locked );
788
797 void relativeXChanged( bool relative );
798
807 void relativeYChanged( bool relative );
808
817 void relativeZChanged( bool relative );
818
827 void relativeMChanged( bool relative );
828
837 void relativeAngleChanged( bool relative );
838
845 void softLockLineExtensionChanged( bool locked );
846
853 void softLockXyChanged( bool locked );
854
855 // relativeDistanceChanged doesn't exist as distance is always relative
856
866 void enabledChangedX( bool enabled );
867
877 void enabledChangedY( bool enabled );
878
888 void enabledChangedZ( bool enabled );
889
899 void enabledChangedM( bool enabled );
900
910 void enabledChangedAngle( bool enabled );
911
921 void enabledChangedDistance( bool enabled );
922
930
938
946
954
962
970
976
982
983 private slots:
985 void betweenLineConstraintClicked( bool activated );
986
988 void lockConstraint( bool activate = true );
989
991 void lockParameterlessConstraint( bool activate = true );
992
997 void constraintTextEdited( const QString &textValue );
998
1003 void constraintFocusOut();
1004
1006 void setConstraintRelative( bool activate );
1007
1009 void setConstraintRepeatingLock( bool activate );
1010
1015 void activateCad( bool enabled );
1016
1018 void setConstructionMode( bool enabled );
1019
1021 void settingsButtonTriggered( QAction *action );
1022
1023 private:
1024
1028 QgsMapLayer *targetLayer() const;
1029
1031 void setCadEnabled( bool enabled );
1032
1037 void updateCapacity( bool updateUIwithoutChange = false );
1038
1040 void lockBetweenLineConstraint( Qgis::BetweenLineConstraint constraint );
1041
1047 QList<QgsPointXY> snapSegmentToAllLayers( const QgsPointXY &originalMapPoint, bool *snapped = nullptr ) const;
1048
1053 bool filterKeyPress( QKeyEvent *e );
1054
1059 bool eventFilter( QObject *obj, QEvent *event ) override SIP_SKIP;
1060
1062 void triggerMouseMoveEvent();
1063
1065 CadConstraint *objectToConstraint( const QObject *obj ) const;
1066
1068 double parseUserInput( const QString &inputValue, const Qgis::CadConstraintType type, bool &ok ) const;
1069
1076 void updateConstraintValue( CadConstraint *constraint, const QString &textValue, bool convertExpression = false );
1077
1079 void updateUnlockedConstraintValues( const QgsPoint &point );
1080
1086 void toggleLockedSnapVertex( const QgsPointLocator::Match &snapMatch, QgsPointLocator::Match previouslySnap );
1087
1091 void resetConstructionGuides();
1092
1097 void updateConstructionGuidesCrs();
1098
1099 QgsMapCanvas *mMapCanvas = nullptr;
1100 QgsUserInputWidget *mUserInputWidget = nullptr;
1101
1102 QgsAdvancedDigitizingCanvasItem *mCadPaintItem = nullptr;
1104 std::unique_ptr<QgsSnapIndicator> mSnapIndicator;
1105
1106 CadCapacities mCapacities = CadCapacities();
1107
1108 bool mCurrentMapToolSupportsCad = false;
1109
1110 // Pointer to the floater
1111 QgsAdvancedDigitizingFloater *mFloater = nullptr;
1112
1113 // CAD properties
1115 bool mCadEnabled = false;
1116 bool mConstructionMode = false;
1117
1118 // constraints
1119 std::unique_ptr< CadConstraint > mAngleConstraint;
1120 std::unique_ptr< CadConstraint > mDistanceConstraint;
1121 std::unique_ptr< CadConstraint > mXConstraint;
1122 std::unique_ptr< CadConstraint > mYConstraint;
1123 std::unique_ptr< CadConstraint > mZConstraint;
1124 std::unique_ptr< CadConstraint > mMConstraint;
1125 std::unique_ptr< CadConstraint > mLineExtensionConstraint;
1126 std::unique_ptr< CadConstraint > mXyVertexConstraint;
1127 Qgis::BetweenLineConstraint mBetweenLineConstraint;
1128 double mCommonAngleConstraint; // if 0: do not snap to common angles
1129
1131 bool mSnappingPrioritizeFeatures = false;
1132
1133 // Point list and current snap point / segment
1134 QList<QgsPoint> mCadPointList;
1135 QList<QgsPointXY> mSnappedSegment;
1136
1137 bool mSessionActive = false;
1138
1139 // Construction path history
1140 std::unique_ptr<QgsVectorLayer> mConstructionGuidesLayer;
1141 QgsFeatureId mConstructionGuideId;
1142 QgsLineString mConstructionGuideLine;
1143 bool mDeferredUpdateConstructionGuidesCrs = false;
1144
1145 // Error message
1146 std::unique_ptr<QgsMessageBarItem> mErrorMessage;
1147
1148 // UI
1149 QMap< double, QAction *> mCommonAngleActions; // map the common angle actions with their angle values
1150 QAction *mLineExtensionAction = nullptr;
1151 QAction *mXyVertexAction = nullptr;
1152 QAction *mRecordConstructionGuides = nullptr;
1153 QAction *mShowConstructionGuides = nullptr;
1154 QAction *mSnapToConstructionGuides = nullptr;
1155 QAction *mClearConstructionGuides = nullptr;
1156
1157 // Snap indicator
1158 QgsPointLocator::Match mSnapMatch;
1159 QgsPointLocator::Match mLastSnapMatch;
1160
1161 // Extra constraint context
1162 Qgis::LineExtensionSide mSoftLockLineExtension;
1163 double mSoftLockX;
1164 double mSoftLockY;
1165 QQueue< QgsPointLocator::Match > mLockedSnapVertices;
1166
1167 // Advanced digitizing tool
1168 QPointer<QgsAdvancedDigitizingTool> mCurrentTool;
1169
1170#ifdef SIP_RUN
1172 bool eventFilter( QObject *obj, QEvent *event );
1173#endif
1175 QgsPoint pointXYToPoint( const QgsPointXY &point ) const;
1176
1177 QMenu *mCommonAngleActionsMenu = nullptr;
1178 QMenu *mFloaterActionsMenu = nullptr;
1179
1180 static const QgsSettingsEntryBool *settingsCadSnappingPriorityPrioritizeFeature;
1181 static const QgsSettingsEntryBool *settingsCadRecordConstructionGuides;
1182 static const QgsSettingsEntryBool *settingsCadShowConstructionGuides;
1183 static const QgsSettingsEntryBool *settingsCadSnapToConstructionGuides;
1184
1185 friend class TestQgsAdvancedDigitizing;
1186 friend class TestQgsAdvancedDigitizingDockWidget;
1187};
1188
1190
1191#endif // QGSADVANCEDDIGITIZINGDOCK_H
CadConstraintType
Advanced digitizing constraint type.
Definition qgis.h:3783
@ Generic
Generic value.
BetweenLineConstraint
Between line constraints which can be enabled.
Definition qgis.h:3757
LineExtensionSide
Designates whether the line extension constraint is currently soft locked with the previous or next v...
Definition qgis.h:3770
The QgsAdvancedDigitizingCanvasItem class draws the graphical elements of the CAD tools (.
The CadConstraint is a class for all basic constraints (angle/distance/x/y).
CadConstraint(QLineEdit *lineEdit, QToolButton *lockerButton, QToolButton *relativeButton=nullptr, QToolButton *repeatingLockButton=nullptr)
Constructor for CadConstraint.
bool isLocked() const
Is any kind of lock mode enabled.
bool isRepeatingLock() const
Returns true if a repeating lock is set for the constraint.
LockMode lockMode() const
The current lock mode of this constraint.
int precision() const
Returns the numeric precision (decimal places) to show in the associated widget.
bool relative() const
Is the constraint in relative mode.
QLineEdit * lineEdit() const
The line edit that manages the value of the constraint.
The QgsAdvancedDigitizingDockWidget class is a dockable widget used to handle the CAD tools on top of...
void valueDistanceChanged(const QString &value)
Emitted whenever the distance value changes (either the mouse moved, or the user changed the input).
bool commonAngleConstraint() const
Returns true if a constraint on a common angle is active.
Q_DECL_DEPRECATED QgsPointXY currentPoint(bool *exists=nullptr) const
The last point.
void lockZChanged(bool locked)
Emitted whenever the Z parameter is locked.
double softLockY() const
Returns the Y value of the Y soft lock. The value is NaN is the constraint isn't magnetized to a line...
const CadConstraint * constraintM() const
Returns the CadConstraint on the M coordinate.
void enabledChangedY(bool enabled)
Emitted whenever the Y field is enabled or disabled.
QAction * enableAction()
Returns the action used to enable/disable the tools.
bool cadEnabled() const
determines if CAD tools are enabled or if map tools behaves "nomally"
int pointsCount() const
The number of points in the CAD point helper list.
QList< QgsPointXY > snappedSegment() const
Snapped to a segment.
void relativeMChanged(bool relative)
Emitted whenever the M parameter is toggled between absolute and relative.
void lockXChanged(bool locked)
Emitted whenever the X parameter is locked.
void softLockLineExtensionChanged(bool locked)
Emitted whenever the soft line extension parameter is locked.
void focusOnXRequested()
Emitted whenever the X field should get the focus using the shortcuts (X).
bool constructionMode() const
Returns whether the construction mode is activated.
void enabledChangedX(bool enabled)
Emitted whenever the X field is enabled or disabled.
void valueYChanged(const QString &value)
Emitted whenever the Y value changes (either the mouse moved, or the user changed the input).
Q_DECL_DEPRECATED QgsPointXY penultimatePoint(bool *exists=nullptr) const
The penultimate point.
const CadConstraint * constraintLineExtension() const
Returns the CadConstraint.
void focusOnYRequested()
Emitted whenever the Y field should get the focus using the shortcuts (Y).
void enabledChangedDistance(bool enabled)
Emitted whenever the distance field is enabled or disabled.
bool snappedToVertex() const
Is it snapped to a vertex.
void valueZChanged(const QString &value)
Emitted whenever the Z value changes (either the mouse moved, or the user changed the input).
QList< QgsPointLocator::Match > lockedSnapVertices() const
Returns the snap matches whose vertices have been locked.
void lockAngleChanged(bool locked)
Emitted whenever the angle parameter is locked.
void pointChangedV2(const QgsPoint &point)
Sometimes a constraint may change the current point out of a mouse event.
void commonAngleSnappingShowInFloaterChanged(bool enabled)
Emitted whenever the option to show common angle snapping in the floater changes.
void relativeXChanged(bool relative)
Emitted whenever the X parameter is toggled between absolute and relative.
void focusOnAngleRequested()
Emitted whenever the angle field should get the focus using the shortcuts (A).
WidgetSetMode
Type of interaction to simulate when editing values from external widget.
const CadConstraint * constraintXyVertex() const
Returns the CadConstraint.
void focusOnZRequested()
Emitted whenever the Z field should get the focus using the shortcuts (Z).
void focusOnMRequested()
Emitted whenever the M field should get the focus using the shortcuts (M).
void popWarning()
Remove any previously emitted warnings (if any)
void valueXChanged(const QString &value)
Emitted whenever the X value changes (either the mouse moved, or the user changed the input).
void lockMChanged(bool locked)
Emitted whenever the M parameter is locked.
void cadEnabledChanged(bool enabled)
Signals for external widgets that need to update according to current values.
void lockYChanged(bool locked)
Emitted whenever the Y parameter is locked.
const CadConstraint * constraintY() const
Returns the CadConstraint on the Y coordinate.
void valueAngleChanged(const QString &value)
Emitted whenever the angle value changes (either the mouse moved, or the user changed the input).
void valueMChanged(const QString &value)
Emitted whenever the M value changes (either the mouse moved, or the user changed the input).
QgsVectorLayer * constructionGuidesLayer() const
Returns the vector layer within which construction guides are stored.
void relativeZChanged(bool relative)
Emitted whenever the Z parameter is toggled between absolute and relative.
double softLockX() const
Returns the X value of the X soft lock. The value is NaN is the constraint isn't magnetized to a line...
Q_DECL_DEPRECATED void pointChanged(const QgsPointXY &point)
Sometimes a constraint may change the current point out of a mouse event.
CadCapacity
The CadCapacity enum defines the possible constraints to be set depending on the number of points in ...
Qgis::BetweenLineConstraint betweenLineConstraint() const
Returns the between line constraints which are used to place perpendicular/parallel segments to snapp...
void enabledChangedAngle(bool enabled)
Emitted whenever the angle field is enabled or disabled.
Q_DECL_DEPRECATED QgsPointXY previousPoint(bool *exists=nullptr) const
The previous point.
void enabledChangedZ(bool enabled)
Emitted whenever the Z field is enabled or disabled.
void lockDistanceChanged(bool locked)
Emitted whenever the distance parameter is locked.
void relativeAngleChanged(bool relative)
Emitted whenever the angleX parameter is toggled between absolute and relative.
const CadConstraint * constraintX() const
Returns the CadConstraint on the X coordinate.
CadCapacities capacities() const
Returns the capacities.
void softLockXyChanged(bool locked)
Emitted whenever the soft x/y extension parameter is locked.
const CadConstraint * constraintZ() const
Returns the CadConstraint on the Z coordinate.
void valueBearingChanged(const QString &value)
Emitted whenever the bearing value changes.
void enabledChangedM(bool enabled)
Emitted whenever the M field is enabled or disabled.
QgsPointLocator::Match mapPointMatch() const
Returns the point locator match.
void focusOnDistanceRequested()
Emitted whenever the distance field should get the focus using the shortcuts (D).
const CadConstraint * constraintAngle() const
Returns the CadConstraint on the angle.
void valueCommonAngleSnappingChanged(double angle)
Emitted whenever the snapping to common angle option changes, angle = 0 means that the functionality ...
void pushWarning(const QString &message)
Push a warning.
Qgis::LineExtensionSide lineExtensionSide() const
Returns on which side of the constraint line extension point, the line was created.
const CadConstraint * constraintDistance() const
Returns the CadConstraint on the distance.
void relativeYChanged(bool relative)
Emitted whenever the Y parameter is toggled between absolute and relative.
The QgsAdvancedDigitizingFloater class is widget that floats next to the mouse pointer,...
An abstract class for advanced digitizing tools.
QgsDockWidget subclass with more fine-grained control over how the widget is closed or opened.
Line string geometry type, with support for z-dimension and m-values.
Map canvas is a class for displaying all GIS data types on a canvas.
Base class for all map layer types.
Definition qgsmaplayer.h:76
A QgsMapMouseEvent is the result of a user interaction with the mouse on a QgsMapCanvas.
The QgsMapToolAdvancedDigitizing class is a QgsMapTool which gives event directly in map coordinates ...
Abstract base class for all map tools.
Definition qgsmaptool.h:71
A class to represent a 2D point.
Definition qgspointxy.h:60
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:49
A boolean settings entry.
The QgsUserInputWidget class is a floating widget that shall be used to display widgets for user inpu...
Represents a vector layer which manages a vector based data sets.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition qgis.h:5917
#define SIP_DEPRECATED
Definition qgis_sip.h:106
#define SIP_ENUM_BASETYPE(type)
Definition qgis_sip.h:278
#define SIP_SKIP
Definition qgis_sip.h:126
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsTextRendererUtils::CurvedTextFlags)
int precision