Skip to content

Commit

Permalink
Allow CAD dock to be used for geographic CRS, but only allow
Browse files Browse the repository at this point in the history
the x/y/z/m constraints to be set (not distance or angle based
constraints)
  • Loading branch information
nyalldawson committed Sep 23, 2021
1 parent 842e774 commit a94dd8b
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 24 deletions.
Expand Up @@ -31,6 +31,7 @@ by implementing filters called from :py:class:`QgsMapToolAdvancedDigitizing`.
AbsoluteAngle,
RelativeAngle,
RelativeCoordinates,
Distance,
};
typedef QFlags<QgsAdvancedDigitizingDockWidget::CadCapacity> CadCapacities;

Expand Down
63 changes: 39 additions & 24 deletions src/gui/qgsadvanceddigitizingdockwidget.cpp
Expand Up @@ -716,14 +716,21 @@ void QgsAdvancedDigitizingDockWidget::lockAdditionalConstraint( AdditionalConstr
void QgsAdvancedDigitizingDockWidget::updateCapacity( bool updateUIwithoutChange )
{
CadCapacities newCapacities = CadCapacities();
const bool isGeographic = mMapCanvas->mapSettings().destinationCrs().isGeographic();
if ( !isGeographic )
newCapacities |= Distance;

// first point is the mouse point (it doesn't count)
if ( mCadPointList.count() > 1 )
{
newCapacities |= AbsoluteAngle | RelativeCoordinates;
newCapacities |= RelativeCoordinates;
if ( !isGeographic )
newCapacities |= AbsoluteAngle;
}
if ( mCadPointList.count() > 2 )
{
newCapacities |= RelativeAngle;
if ( !isGeographic )
newCapacities |= RelativeAngle;
}
if ( !updateUIwithoutChange && newCapacities == mCapacities )
{
Expand All @@ -735,12 +742,13 @@ void QgsAdvancedDigitizingDockWidget::updateCapacity( bool updateUIwithoutChange
// update the UI according to new capacities
// still keep the old to compare

const bool distance = mCadEnabled && newCapacities.testFlag( Distance );
const bool relativeAngle = mCadEnabled && newCapacities.testFlag( RelativeAngle );
const bool absoluteAngle = mCadEnabled && newCapacities.testFlag( AbsoluteAngle );
const bool relativeCoordinates = mCadEnabled && newCapacities.testFlag( RelativeCoordinates );

mPerpendicularAction->setEnabled( absoluteAngle && snappingEnabled );
mParallelAction->setEnabled( absoluteAngle && snappingEnabled );
mPerpendicularAction->setEnabled( distance && absoluteAngle && snappingEnabled );
mParallelAction->setEnabled( distance && absoluteAngle && snappingEnabled );

//update tooltips on buttons
if ( !snappingEnabled )
Expand Down Expand Up @@ -782,10 +790,10 @@ void QgsAdvancedDigitizingDockWidget::updateCapacity( bool updateUIwithoutChange
}

// distance is always relative
mLockDistanceButton->setEnabled( relativeCoordinates );
mDistanceLineEdit->setEnabled( relativeCoordinates );
emit enabledChangedDistance( relativeCoordinates );
if ( !relativeCoordinates )
mLockDistanceButton->setEnabled( distance && relativeCoordinates );
mDistanceLineEdit->setEnabled( distance && relativeCoordinates );
emit enabledChangedDistance( distance && relativeCoordinates );
if ( !( distance && relativeCoordinates ) )
{
mDistanceConstraint->setLockMode( CadConstraint::NoLock );
}
Expand Down Expand Up @@ -822,7 +830,7 @@ bool QgsAdvancedDigitizingDockWidget::applyConstraints( QgsMapMouseEvent *e )
context.angleConstraint = _constraint( mAngleConstraint.get() );
context.setCadPoints( mCadPointList );

context.commonAngleConstraint.locked = true;
context.commonAngleConstraint.locked = !mMapCanvas->mapSettings().destinationCrs().isGeographic();
context.commonAngleConstraint.relative = context.angleConstraint.relative;
context.commonAngleConstraint.value = mCommonAngleConstraint;

Expand Down Expand Up @@ -1330,7 +1338,7 @@ bool QgsAdvancedDigitizingDockWidget::filterKeyPress( QKeyEvent *e )
// modifier+d ONLY caught for ShortcutOverride events...
if ( type == QEvent::ShortcutOverride && ( e->modifiers() == Qt::AltModifier || e->modifiers() == Qt::ControlModifier ) )
{
if ( mCapacities.testFlag( RelativeCoordinates ) )
if ( mCapacities.testFlag( RelativeCoordinates ) && mCapacities.testFlag( Distance ) )
{
mDistanceConstraint->toggleLocked();
emit lockDistanceChanged( mDistanceConstraint->isLocked() );
Expand Down Expand Up @@ -1396,25 +1404,32 @@ void QgsAdvancedDigitizingDockWidget::enable()
connect( mMapCanvas, &QgsMapCanvas::destinationCrsChanged, this, &QgsAdvancedDigitizingDockWidget::enable, Qt::UniqueConnection );
if ( mMapCanvas->mapSettings().destinationCrs().isGeographic() )
{
mErrorLabel->setText( tr( "CAD tools can not be used on geographic coordinates. Change the coordinates system in the project properties." ) );
mErrorLabel->show();
mEnableAction->setEnabled( false );
setCadEnabled( false );
mAngleLineEdit->setEnabled( false );
mAngleLineEdit->setToolTip( tr( "Angle constraint cannot be used on geographic coordinates. Change the coordinates system in the project properties." ) );

mDistanceLineEdit->setEnabled( false );
mDistanceLineEdit->setToolTip( tr( "Distance constraint cannot be used on geographic coordinates. Change the coordinates system in the project properties." ) );
}
else
{
mEnableAction->setEnabled( true );
mErrorLabel->hide();
mCadWidget->show();
mAngleLineEdit->setEnabled( true );
mAngleLineEdit->setToolTip( tr( "xxx" ) );

mCurrentMapToolSupportsCad = true;
mDistanceLineEdit->setEnabled( true );
mDistanceLineEdit->setToolTip( tr( "xxx" ) );
}

if ( mSessionActive && !isVisible() )
{
show();
}
setCadEnabled( mSessionActive );
mEnableAction->setEnabled( true );
mErrorLabel->hide();
mCadWidget->show();

mCurrentMapToolSupportsCad = true;

if ( mSessionActive && !isVisible() )
{
show();
}
setCadEnabled( mSessionActive );
}

void QgsAdvancedDigitizingDockWidget::disable()
Expand Down Expand Up @@ -1530,7 +1545,7 @@ void QgsAdvancedDigitizingDockWidget::CadConstraint::setRelative( bool relative
void QgsAdvancedDigitizingDockWidget::CadConstraint::setValue( double value, bool updateWidget )
{
mValue = value;
if ( updateWidget )
if ( updateWidget && mLineEdit->isEnabled() )
mLineEdit->setText( QLocale().toString( value, 'f', 6 ) );
}

Expand Down
1 change: 1 addition & 0 deletions src/gui/qgsadvanceddigitizingdockwidget.h
Expand Up @@ -61,6 +61,7 @@ class GUI_EXPORT QgsAdvancedDigitizingDockWidget : public QgsDockWidget, private
AbsoluteAngle = 1, //!< Azimuth
RelativeAngle = 2, //!< Also for parallel and perpendicular
RelativeCoordinates = 4, //!< This corresponds to distance and relative coordinates
Distance = 8, //!< Distance
};
Q_DECLARE_FLAGS( CadCapacities, CadCapacity )
Q_FLAG( CadCapacities )
Expand Down

0 comments on commit a94dd8b

Please sign in to comment.