Skip to content

Commit 295e1b5

Browse files
nyalldawson3nids
authored andcommitted
[FEATURE] Allow map simplify tool to smooth features
And rename to "Simplify/smooth features". This change allows interactive smoothing of features.
1 parent dce2188 commit 295e1b5

File tree

4 files changed

+223
-98
lines changed

4 files changed

+223
-98
lines changed

src/app/qgsmaptoolsimplify.cpp

+69-12
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,40 @@ QgsSimplifyDialog::QgsSimplifyDialog( QgsMapToolSimplify *tool, QWidget *parent
3535
{
3636
setupUi( this );
3737

38-
mMethodComboBox->addItem( tr( "Simplify by distance" ), ( int )QgsVectorSimplifyMethod::Distance );
39-
mMethodComboBox->addItem( tr( "Simplify by snapping to grid" ), ( int )QgsVectorSimplifyMethod::SnapToGrid );
40-
mMethodComboBox->addItem( tr( "Simplify by area (Visvalingam)" ), ( int )QgsVectorSimplifyMethod::Visvalingam );
38+
mMethodComboBox->addItem( tr( "Simplify by distance" ), QgsMapToolSimplify::SimplifyDistance );
39+
mMethodComboBox->addItem( tr( "Simplify by snapping to grid" ), QgsMapToolSimplify::SimplifySnapToGrid );
40+
mMethodComboBox->addItem( tr( "Simplify by area (Visvalingam)" ), QgsMapToolSimplify::SimplifyVisvalingam );
41+
mMethodComboBox->addItem( tr( "Smooth" ), QgsMapToolSimplify::Smooth );
4142

4243
spinTolerance->setValue( mTool->tolerance() );
4344
spinTolerance->setShowClearButton( false );
4445
cboToleranceUnits->setCurrentIndex( ( int ) mTool->toleranceUnits() );
46+
47+
mOffsetSpin->setClearValue( 25 );
48+
mOffsetSpin->setValue( mTool->smoothOffset() * 100 );
49+
mIterationsSpin->setClearValue( 1 );
50+
mIterationsSpin->setValue( mTool->smoothIterations() );
51+
4552
mMethodComboBox->setCurrentIndex( mMethodComboBox->findData( mTool->method() ) );
53+
if ( mMethodComboBox->currentData().toInt() != QgsMapToolSimplify::Smooth )
54+
mOptionsStackedWidget->setCurrentIndex( 0 );
55+
else
56+
mOptionsStackedWidget->setCurrentIndex( 1 );
4657

4758
// communication with map tool
4859
connect( spinTolerance, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), mTool, &QgsMapToolSimplify::setTolerance );
4960
connect( cboToleranceUnits, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), mTool, &QgsMapToolSimplify::setToleranceUnits );
5061
connect( mMethodComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), mTool, [ = ]
5162
{
52-
mTool->setMethod( static_cast< QgsMapToPixelSimplifier::SimplifyAlgorithm >( mMethodComboBox->currentData().toInt() ) );
63+
mTool->setMethod( static_cast< QgsMapToolSimplify::Method >( mMethodComboBox->currentData().toInt() ) );
64+
if ( mMethodComboBox->currentData().toInt() != QgsMapToolSimplify::Smooth )
65+
mOptionsStackedWidget->setCurrentIndex( 0 );
66+
else
67+
mOptionsStackedWidget->setCurrentIndex( 1 );
5368
} );
69+
70+
connect( mOffsetSpin, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mTool, [ = ]( int value ) { mTool->setSmoothOffset( value / 100.0 ); } );
71+
connect( mIterationsSpin, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mTool, [ = ]( int value ) { mTool->setSmoothIterations( value ); } );
5472
connect( okButton, &QAbstractButton::clicked, mTool, &QgsMapToolSimplify::storeSimplified );
5573
}
5674

@@ -79,8 +97,10 @@ QgsMapToolSimplify::QgsMapToolSimplify( QgsMapCanvas *canvas )
7997
{
8098
QgsSettings settings;
8199
mTolerance = settings.value( QStringLiteral( "digitizing/simplify_tolerance" ), 1 ).toDouble();
82-
mToleranceUnits = settings.enumValue( QStringLiteral( "digitizing/simplify_tolerance_units" ), QgsTolerance::LayerUnits );
83-
mMethod = static_cast< QgsMapToPixelSimplifier::SimplifyAlgorithm >( settings.value( QStringLiteral( "digitizing/simplify_method" ), 0 ).toInt() );
100+
mToleranceUnits = static_cast< QgsTolerance::UnitType >( settings.value( QStringLiteral( "digitizing/simplify_tolerance_units" ), 0 ).toInt() );
101+
mMethod = static_cast< QgsMapToolSimplify::Method >( settings.value( QStringLiteral( "digitizing/simplify_method" ), 0 ).toInt() );
102+
mSmoothIterations = settings.value( QStringLiteral( "digitizing/smooth_iterations" ), 1 ).toInt();
103+
mSmoothOffset = settings.value( QStringLiteral( "digitizing/smooth_offset" ), 0.25 ).toDouble();
84104

85105
mSimplifyDialog = new QgsSimplifyDialog( this, canvas->topLevelWidget() );
86106
}
@@ -144,25 +164,62 @@ QgsGeometry QgsMapToolSimplify::processGeometry( const QgsGeometry &geometry, do
144164
{
145165
switch ( mMethod )
146166
{
147-
case QgsMapToPixelSimplifier::Distance:
167+
case SimplifyDistance:
148168
return geometry.simplify( tolerance );
149169

150-
case QgsMapToPixelSimplifier::SnapToGrid:
151-
case QgsMapToPixelSimplifier::Visvalingam:
170+
case SimplifySnapToGrid:
171+
case SimplifyVisvalingam:
152172
{
153-
QgsMapToPixelSimplifier simplifier( QgsMapToPixelSimplifier::SimplifyGeometry, tolerance, mMethod );
173+
174+
QgsMapToPixelSimplifier simplifier( QgsMapToPixelSimplifier::SimplifyGeometry, tolerance, mMethod == SimplifySnapToGrid ? QgsMapToPixelSimplifier::SnapToGrid : QgsMapToPixelSimplifier::Visvalingam );
154175
return simplifier.simplify( geometry );
155176
}
177+
178+
case Smooth:
179+
return geometry.smooth( mSmoothIterations, mSmoothOffset );
180+
156181
}
157182
return QgsGeometry(); //no warnings
158183
}
159184

160-
QgsMapToPixelSimplifier::SimplifyAlgorithm QgsMapToolSimplify::method() const
185+
double QgsMapToolSimplify::smoothOffset() const
186+
{
187+
return mSmoothOffset;
188+
}
189+
190+
void QgsMapToolSimplify::setSmoothOffset( double smoothOffset )
191+
{
192+
mSmoothOffset = smoothOffset;
193+
194+
QgsSettings settings;
195+
settings.setValue( QStringLiteral( "digitizing/smooth_offset" ), smoothOffset );
196+
197+
if ( !mSelectedFeatures.isEmpty() )
198+
updateSimplificationPreview();
199+
}
200+
201+
int QgsMapToolSimplify::smoothIterations() const
202+
{
203+
return mSmoothIterations;
204+
}
205+
206+
void QgsMapToolSimplify::setSmoothIterations( int smoothIterations )
207+
{
208+
mSmoothIterations = smoothIterations;
209+
210+
QgsSettings settings;
211+
settings.setValue( QStringLiteral( "digitizing/smooth_iterations" ), smoothIterations );
212+
213+
if ( !mSelectedFeatures.isEmpty() )
214+
updateSimplificationPreview();
215+
}
216+
217+
QgsMapToolSimplify::Method QgsMapToolSimplify::method() const
161218
{
162219
return mMethod;
163220
}
164221

165-
void QgsMapToolSimplify::setMethod( QgsMapToPixelSimplifier::SimplifyAlgorithm method )
222+
void QgsMapToolSimplify::setMethod( QgsMapToolSimplify::Method method )
166223
{
167224
mMethod = method;
168225

src/app/qgsmaptoolsimplify.h

+21-4
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
#include "qgsfeature.h"
2424
#include "qgstolerance.h"
2525
#include "qgis_app.h"
26-
#include "qgsmaptopixelgeometrysimplifier.h"
2726

2827
class QgsRubberBand;
2928
class QgsMapToolSimplify;
@@ -56,6 +55,15 @@ class APP_EXPORT QgsMapToolSimplify: public QgsMapToolEdit
5655
{
5756
Q_OBJECT
5857
public:
58+
59+
enum Method
60+
{
61+
SimplifyDistance = 0,
62+
SimplifySnapToGrid = 1,
63+
SimplifyVisvalingam = 2,
64+
Smooth = 3
65+
};
66+
5967
QgsMapToolSimplify( QgsMapCanvas *canvas );
6068
~QgsMapToolSimplify() override;
6169

@@ -72,9 +80,15 @@ class APP_EXPORT QgsMapToolSimplify: public QgsMapToolEdit
7280

7381
QString statusText() const;
7482

75-
QgsMapToPixelSimplifier::SimplifyAlgorithm method() const;
83+
Method method() const;
84+
85+
void setMethod( Method method );
7686

77-
void setMethod( QgsMapToPixelSimplifier::SimplifyAlgorithm method );
87+
int smoothIterations() const;
88+
void setSmoothIterations( int smoothIterations );
89+
90+
double smoothOffset() const;
91+
void setSmoothOffset( double smoothOffset );
7892

7993
public slots:
8094
//! Slot to change display when slidebar is moved
@@ -125,7 +139,10 @@ class APP_EXPORT QgsMapToolSimplify: public QgsMapToolEdit
125139
int mReducedVertexCount = 0;
126140
bool mReducedHasErrors = false;
127141

128-
QgsMapToPixelSimplifier::SimplifyAlgorithm mMethod = QgsMapToPixelSimplifier::Distance;
142+
Method mMethod = SimplifyDistance;
143+
144+
int mSmoothIterations = 1;
145+
double mSmoothOffset = 0.25;
129146

130147
};
131148

src/ui/qgisapp.ui

+7-35
Original file line numberDiff line numberDiff line change
@@ -643,12 +643,12 @@
643643
<addaction name="mActionNewSpatiaLiteLayer"/>
644644
<addaction name="mActionNewMemoryLayer"/>
645645
</widget>
646-
<widget class="QToolBar" name="mShapeDigitizeToolBar">
646+
<widget class="QToolBar" name="mRegularShapeDigitizeToolBar">
647647
<property name="windowTitle">
648-
<string>Shape Digitizing Toolbar</string>
648+
<string>Regular Shape Digitizing Toolbar</string>
649649
</property>
650650
<property name="toolTip">
651-
<string>Shape Digitizing Toolbar</string>
651+
<string>Regular Shape Digitizing Toolbar</string>
652652
</property>
653653
<attribute name="toolBarArea">
654654
<enum>TopToolBarArea</enum>
@@ -741,7 +741,7 @@
741741
<action name="mActionExit">
742742
<property name="icon">
743743
<iconset resource="../../images/images.qrc">
744-
<normaloff>:/images/themes/default/mActionFileExit.svg</normaloff>:/images/themes/default/mActionFileExit.svg</iconset>
744+
<normaloff>:/images/themes/default/mActionFileExit.png</normaloff>:/images/themes/default/mActionFileExit.png</iconset>
745745
</property>
746746
<property name="text">
747747
<string>Exit QGIS</string>
@@ -997,7 +997,7 @@
997997
</property>
998998
<property name="icon">
999999
<iconset resource="../../images/images.qrc">
1000-
<normaloff>:/images/themes/default/mActionMoveVertex.svg</normaloff>:/images/themes/default/mActionMoveVertex.svg</iconset>
1000+
<normaloff>:/images/themes/default/mActionMoveVertex.png</normaloff>:/images/themes/default/mActionMoveVertex.png</iconset>
10011001
</property>
10021002
<property name="text">
10031003
<string>Offset Point Symbol</string>
@@ -1649,7 +1649,7 @@
16491649
<action name="mActionProjectProperties">
16501650
<property name="icon">
16511651
<iconset resource="../../images/images.qrc">
1652-
<normaloff>:/images/themes/default/mActionProjectProperties.svg</normaloff>:/images/themes/default/mActionProjectProperties.svg</iconset>
1652+
<normaloff>:/images/themes/default/mActionProjectProperties.png</normaloff>:/images/themes/default/mActionProjectProperties.png</iconset>
16531653
</property>
16541654
<property name="text">
16551655
<string>&amp;Project Properties...</string>
@@ -1904,7 +1904,7 @@ Ctrl (Cmd) increments by 15 deg.</string>
19041904
<action name="mActionDecorationNorthArrow">
19051905
<property name="icon">
19061906
<iconset resource="../../images/images.qrc">
1907-
<normaloff>:/images/themes/default/north_arrow.svg</normaloff>:/images/themes/default/north_arrow.svg</iconset>
1907+
<normaloff>:/images/themes/default/north_arrow.png</normaloff>:/images/themes/default/north_arrow.png</iconset>
19081908
</property>
19091909
<property name="text">
19101910
<string>&amp;North Arrow…</string>
@@ -2962,34 +2962,6 @@ Acts on currently active editable layer</string>
29622962
</widget>
29632963
<resources>
29642964
<include location="../../images/images.qrc"/>
2965-
<include location="../../images/images.qrc"/>
2966-
<include location="../../images/images.qrc"/>
2967-
<include location="../../images/images.qrc"/>
2968-
<include location="../../images/images.qrc"/>
2969-
<include location="../../images/images.qrc"/>
2970-
<include location="../../images/images.qrc"/>
2971-
<include location="../../images/images.qrc"/>
2972-
<include location="../../images/images.qrc"/>
2973-
<include location="../../images/images.qrc"/>
2974-
<include location="../../images/images.qrc"/>
2975-
<include location="../../images/images.qrc"/>
2976-
<include location="../../images/images.qrc"/>
2977-
<include location="../../images/images.qrc"/>
2978-
<include location="../../images/images.qrc"/>
2979-
<include location="../../images/images.qrc"/>
2980-
<include location="../../images/images.qrc"/>
2981-
<include location="../../images/images.qrc"/>
2982-
<include location="../../images/images.qrc"/>
2983-
<include location="../../images/images.qrc"/>
2984-
<include location="../../images/images.qrc"/>
2985-
<include location="../../images/images.qrc"/>
2986-
<include location="../../images/images.qrc"/>
2987-
<include location="../../images/images.qrc"/>
2988-
<include location="../../images/images.qrc"/>
2989-
<include location="../../images/images.qrc"/>
2990-
<include location="../../images/images.qrc"/>
2991-
<include location="../../images/images.qrc"/>
2992-
<include location="../../images/images.qrc"/>
29932965
</resources>
29942966
<connections/>
29952967
</ui>

0 commit comments

Comments
 (0)