Skip to content

Commit c39ffe9

Browse files
committedAug 17, 2015
[FEATURE]: Tool to add circular strings with start point, curve point and end point
1 parent 9b31f34 commit c39ffe9

37 files changed

+308
-118
lines changed
 

‎images/images.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,7 @@
504504
<file>themes/default/mIconClear.png</file>
505505
<file>flags/zh.png</file>
506506
<file>themes/default/mIconPaintEffects.svg</file>
507+
<file>themes/default/mActionCircularStringCurvePoint.png</file>
507508
</qresource>
508509
<qresource prefix="/images/tips">
509510
<file alias="symbol_levels.png">qgis_tips/symbol_levels.png</file>

‎python/core/geometry/qgsabstractgeometryv2.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class QgsAbstractGeometryV2
9090
virtual QgsRectangle calculateBoundingBox() const;
9191

9292
//render pipeline
93-
virtual void transform( const QgsCoordinateTransform& ct ) = 0;
93+
virtual void transform( const QgsCoordinateTransform& ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform ) = 0;
9494
virtual void transform( const QTransform& t ) = 0;
9595
//virtual void clip( const QgsRectangle& rect );
9696
virtual void draw( QPainter& p ) const = 0;

‎python/core/geometry/qgscircularstringv2.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class QgsCircularStringV2: public QgsCurveV2
3838
virtual QgsLineStringV2* curveToLine() const;
3939

4040
void draw( QPainter& p ) const;
41-
void transform( const QgsCoordinateTransform& ct );
41+
void transform( const QgsCoordinateTransform& ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform );
4242
void transform( const QTransform& t );
4343
//void clip( const QgsRectangle& rect );
4444
void addToPainterPath( QPainterPath& path ) const;

‎python/core/geometry/qgscompoundcurvev2.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class QgsCompoundCurveV2: public QgsCurveV2
4545
void close();
4646

4747
void draw( QPainter& p ) const;
48-
void transform( const QgsCoordinateTransform& ct );
48+
void transform( const QgsCoordinateTransform& ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform );
4949
void transform( const QTransform& t );
5050
void addToPainterPath( QPainterPath& path ) const;
5151
void drawAsPolygon( QPainter& p ) const;

‎python/core/geometry/qgscurvepolygonv2.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class QgsCurvePolygonV2: public QgsSurfaceV2
4949
bool removeInteriorRing( int nr );
5050

5151
virtual void draw( QPainter& p ) const;
52-
void transform( const QgsCoordinateTransform& ct );
52+
void transform( const QgsCoordinateTransform& ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform );
5353
void transform( const QTransform& t );
5454

5555
virtual bool insertVertex( const QgsVertexId& position, const QgsPointV2& vertex );

‎python/core/geometry/qgsgeometrycollectionv2.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class QgsGeometryCollectionV2: public QgsAbstractGeometryV2
2323
virtual bool addGeometry( QgsAbstractGeometryV2* g /Transfer/ );
2424
virtual bool removeGeometry( int nr );
2525

26-
virtual void transform( const QgsCoordinateTransform& ct );
26+
virtual void transform( const QgsCoordinateTransform& ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform );
2727
void transform( const QTransform& t );
2828
//virtual void clip( const QgsRectangle& rect );
2929
virtual void draw( QPainter& p ) const;

‎python/core/geometry/qgslinestringv2.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class QgsLineStringV2: public QgsCurveV2
3838
void append( const QgsLineStringV2* line );
3939

4040
void draw( QPainter& p ) const;
41-
void transform( const QgsCoordinateTransform& ct );
41+
void transform( const QgsCoordinateTransform& ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform );
4242
void transform( const QTransform& t );
4343

4444
void addToPainterPath( QPainterPath& path ) const;

‎src/app/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ SET(QGIS_APP_SRCS
117117
qgsvectorlayerproperties.cpp
118118
qgsvisibilitypresets.cpp
119119
qgshandlebadlayers.cpp
120+
qgsmaptooladdcircularstring.cpp
121+
qgsmaptoolcircularstringcurvepoint.cpp
120122

121123
composer/qgsattributeselectiondialog.cpp
122124
composer/qgscomposer.cpp
@@ -240,6 +242,7 @@ SET (QGIS_APP_MOC_HDRS
240242
qgsmaptoolsimplify.h
241243
qgsmaptoolsplitfeatures.h
242244
qgsmaptoolsplitparts.h
245+
qgsmaptooladdcircularstring.h
243246

244247
nodetool/qgsmaptoolnodetool.h
245248
nodetool/qgsselectedfeature.h

‎src/app/qgisapp.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@
250250
#include "qgsmaptooladdring.h"
251251
#include "qgsmaptoolfillring.h"
252252
#include "qgsmaptoolannotation.h"
253+
#include "qgsmaptoolcircularstringcurvepoint.h"
253254
#include "qgsmaptooldeletering.h"
254255
#include "qgsmaptooldeletepart.h"
255256
#include "qgsmaptoolfeatureaction.h"
@@ -1170,6 +1171,7 @@ void QgisApp::createActions()
11701171
connect( mActionCopyStyle, SIGNAL( triggered() ), this, SLOT( copyStyle() ) );
11711172
connect( mActionPasteStyle, SIGNAL( triggered() ), this, SLOT( pasteStyle() ) );
11721173
connect( mActionAddFeature, SIGNAL( triggered() ), this, SLOT( addFeature() ) );
1174+
connect( mActionCircularStringCurvePoint, SIGNAL( triggered() ), this, SLOT( circularStringCurvePoint() ) );
11731175
connect( mActionMoveFeature, SIGNAL( triggered() ), this, SLOT( moveFeature() ) );
11741176
connect( mActionRotateFeature, SIGNAL( triggered() ), this, SLOT( rotateFeature() ) );
11751177

@@ -1444,6 +1446,7 @@ void QgisApp::createActionGroups()
14441446
mMapToolGroup->addAction( mActionMeasureArea );
14451447
mMapToolGroup->addAction( mActionMeasureAngle );
14461448
mMapToolGroup->addAction( mActionAddFeature );
1449+
mMapToolGroup->addAction( mActionCircularStringCurvePoint );
14471450
mMapToolGroup->addAction( mActionMoveFeature );
14481451
mMapToolGroup->addAction( mActionRotateFeature );
14491452
#if defined(GEOS_VERSION_MAJOR) && defined(GEOS_VERSION_MINOR) && \
@@ -2293,6 +2296,8 @@ void QgisApp::createCanvasTools()
22932296
mMapTools.mAnnotation->setAction( mActionAnnotation );
22942297
mMapTools.mAddFeature = new QgsMapToolAddFeature( mMapCanvas );
22952298
mMapTools.mAddFeature->setAction( mActionAddFeature );
2299+
mMapTools.mCircularStringCurvePoint = new QgsMapToolCircularStringCurvePoint( dynamic_cast<QgsMapToolAddFeature*>( mMapTools.mAddFeature ), mMapCanvas );
2300+
mMapTools.mCircularStringCurvePoint->setAction( mActionCircularStringCurvePoint );
22962301
mMapTools.mMoveFeature = new QgsMapToolMoveFeature( mMapCanvas );
22972302
mMapTools.mMoveFeature->setAction( mActionMoveFeature );
22982303
mMapTools.mRotateFeature = new QgsMapToolRotateFeature( mMapCanvas );
@@ -6159,6 +6164,11 @@ void QgisApp::addFeature()
61596164
mMapCanvas->setMapTool( mMapTools.mAddFeature );
61606165
}
61616166

6167+
void QgisApp::circularStringCurvePoint()
6168+
{
6169+
mMapCanvas->setMapTool( mMapTools.mCircularStringCurvePoint );
6170+
}
6171+
61626172
void QgisApp::selectFeatures()
61636173
{
61646174
mMapCanvas->setMapTool( mMapTools.mSelectFeatures );

‎src/app/qgisapp.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,8 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
966966
void newBookmark();
967967
//! activates the add feature tool
968968
void addFeature();
969+
//! activates the add circular string tool
970+
void circularStringCurvePoint();
969971
//! activates the move feature tool
970972
void moveFeature();
971973
//! activates the offset curve tool
@@ -1471,6 +1473,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
14711473
QgsMapTool *mMeasureArea;
14721474
QgsMapTool *mMeasureAngle;
14731475
QgsMapTool *mAddFeature;
1476+
QgsMapTool *mCircularStringCurvePoint;
14741477
QgsMapTool *mMoveFeature;
14751478
QgsMapTool *mOffsetCurve;
14761479
QgsMapTool *mReshapeFeatures;

‎src/app/qgsmaptooladdfeature.cpp

Lines changed: 30 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717
#include "qgsapplication.h"
1818
#include "qgsattributedialog.h"
1919
#include "qgscsexception.h"
20+
#include "qgscurvepolygonv2.h"
2021
#include "qgsfield.h"
2122
#include "qgsgeometry.h"
23+
#include "qgslinestringv2.h"
2224
#include "qgsmapcanvas.h"
2325
#include "qgsmaplayerregistry.h"
2426
#include "qgsmapmouseevent.h"
27+
#include "qgspolygonv2.h"
2528
#include "qgsproject.h"
2629
#include "qgsvectordataprovider.h"
2730
#include "qgsvectorlayer.h"
@@ -199,56 +202,46 @@ void QgsMapToolAddFeature::canvasMapReleaseEvent( QgsMapMouseEvent* e )
199202
return;
200203
}
201204

205+
if ( mode() == CapturePolygon )
206+
{
207+
closePolygon();
208+
}
209+
202210
//create QgsFeature with wkb representation
203211
QgsFeature* f = new QgsFeature( vlayer->fields(), 0 );
204212

205-
QgsGeometry *g;
213+
//does compoundcurve contain circular strings?
214+
//does provider support circular strings?
215+
bool hasCurvedSegments = captureCurve()->hasCurvedSegments();
216+
bool providerSupportsCurvedSegments = vlayer->dataProvider()->capabilities() & QgsVectorDataProvider::CircularGeometries;
206217

207-
if ( mode() == CaptureLine )
218+
QgsCurveV2* curveToAdd = 0;
219+
if ( hasCurvedSegments && providerSupportsCurvedSegments )
208220
{
209-
if ( layerWKBType == QGis::WKBLineString || layerWKBType == QGis::WKBLineString25D )
210-
{
211-
g = QgsGeometry::fromPolyline( points().toVector() );
212-
}
213-
else if ( layerWKBType == QGis::WKBMultiLineString || layerWKBType == QGis::WKBMultiLineString25D )
214-
{
215-
g = QgsGeometry::fromMultiPolyline( QgsMultiPolyline() << points().toVector() );
216-
}
217-
else
218-
{
219-
emit messageEmitted( tr( "Cannot add feature. Unknown WKB type" ), QgsMessageBar::CRITICAL );
220-
stopCapturing();
221-
delete f;
222-
return; //unknown wkbtype
223-
}
221+
curveToAdd = dynamic_cast<QgsCurveV2*>( captureCurve()->clone() );
222+
}
223+
else
224+
{
225+
curveToAdd = captureCurve()->curveToLine();
226+
}
224227

225-
f->setGeometry( g );
228+
if ( mode() == CaptureLine )
229+
{
230+
f->setGeometry( new QgsGeometry( curveToAdd ) );
226231
}
227-
else // polygon
232+
else
228233
{
229-
if ( layerWKBType == QGis::WKBPolygon || layerWKBType == QGis::WKBPolygon25D )
234+
QgsCurvePolygonV2* poly = 0;
235+
if ( hasCurvedSegments && providerSupportsCurvedSegments )
230236
{
231-
g = QgsGeometry::fromPolygon( QgsPolygon() << points().toVector() );
232-
}
233-
else if ( layerWKBType == QGis::WKBMultiPolygon || layerWKBType == QGis::WKBMultiPolygon25D )
234-
{
235-
g = QgsGeometry::fromMultiPolygon( QgsMultiPolygon() << ( QgsPolygon() << points().toVector() ) );
237+
poly = new QgsCurvePolygonV2();
236238
}
237239
else
238240
{
239-
emit messageEmitted( tr( "Cannot add feature. Unknown WKB type" ), QgsMessageBar::CRITICAL );
240-
stopCapturing();
241-
delete f;
242-
return; //unknown wkbtype
243-
}
244-
245-
if ( !g )
246-
{
247-
stopCapturing();
248-
delete f;
249-
return; // invalid geometry; one possibility is from duplicate points
241+
poly = new QgsPolygonV2();
250242
}
251-
f->setGeometry( g );
243+
poly->setExteriorRing( curveToAdd );
244+
f->setGeometry( poly );
252245

253246
int avoidIntersectionsReturn = f->geometry()->avoidIntersections();
254247
if ( avoidIntersectionsReturn == 1 )

‎src/app/qgsmaptooladdpart.cpp

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@
1414
***************************************************************************/
1515

1616
#include "qgsmaptooladdpart.h"
17+
#include "qgscurvepolygonv2.h"
1718
#include "qgsgeometry.h"
19+
#include "qgslinestringv2.h"
1820
#include "qgsmapcanvas.h"
1921
#include "qgsproject.h"
22+
#include "qgsvectordataprovider.h"
2023
#include "qgsvectorlayer.h"
2124
#include "qgslogger.h"
2225

@@ -118,33 +121,52 @@ void QgsMapToolAddPart::canvasMapReleaseEvent( QgsMapMouseEvent * e )
118121
if ( !isCapturing() )
119122
return;
120123

121-
// we are now going to finish the capturing
122-
123124
if ( mode() == CapturePolygon )
124125
{
125-
//close polygon
126126
closePolygon();
127+
}
128+
129+
//does compoundcurve contain circular strings?
130+
//does provider support circular strings?
131+
bool hasCurvedSegments = captureCurve()->hasCurvedSegments();
132+
bool providerSupportsCurvedSegments = vlayer->dataProvider()->capabilities() & QgsVectorDataProvider::CircularGeometries;
133+
134+
QgsCurveV2* curveToAdd = 0;
135+
if ( hasCurvedSegments && providerSupportsCurvedSegments )
136+
{
137+
curveToAdd = dynamic_cast<QgsCurveV2*>( captureCurve()->clone() );
138+
}
139+
else
140+
{
141+
curveToAdd = captureCurve()->curveToLine();
142+
}
143+
144+
vlayer->beginEditCommand( tr( "Part added" ) );
145+
int errorCode = 0;
146+
if ( mode() == CapturePolygon )
147+
{
127148
//avoid intersections
128-
QgsGeometry* geom = QgsGeometry::fromPolygon( QgsPolygon() << points().toVector() );
129-
if ( geom )
149+
QgsCurvePolygonV2* cp = new QgsCurvePolygonV2();
150+
cp->setExteriorRing( curveToAdd );
151+
QgsGeometry* geom = new QgsGeometry( cp );
152+
geom->avoidIntersections();
153+
154+
const QgsCurvePolygonV2* cpGeom = dynamic_cast<const QgsCurvePolygonV2*>( geom->geometry() );
155+
if ( !cpGeom )
130156
{
131-
geom->avoidIntersections();
132-
QgsPolygon poly = geom->asPolygon();
133-
if ( poly.size() < 1 )
134-
{
135-
stopCapturing();
136-
delete geom;
137-
vlayer->destroyEditCommand();
138-
return;
139-
}
140-
setPoints( geom->asPolygon()[0].toList() );
157+
stopCapturing();
141158
delete geom;
159+
vlayer->destroyEditCommand();
160+
return;
142161
}
143-
}
144-
145-
vlayer->beginEditCommand( tr( "Part added" ) );
146-
errorCode = vlayer->addPart( points() );
147162

163+
errorCode = vlayer->addPart( dynamic_cast<QgsCurveV2*>( cpGeom->exteriorRing()->clone() ) );
164+
delete geom;
165+
}
166+
else
167+
{
168+
errorCode = vlayer->addPart( curveToAdd );
169+
}
148170
stopCapturing();
149171
}
150172
break;

‎src/app/qgsmaptooladdring.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717

1818
#include "qgsmaptooladdring.h"
1919
#include "qgsgeometry.h"
20+
#include "qgslinestringv2.h"
2021
#include "qgsmapcanvas.h"
2122
#include "qgsproject.h"
23+
#include "qgsvectordataprovider.h"
2224
#include "qgsvectorlayer.h"
2325

2426

@@ -80,7 +82,23 @@ void QgsMapToolAddRing::canvasMapReleaseEvent( QgsMapMouseEvent * e )
8082
closePolygon();
8183

8284
vlayer->beginEditCommand( tr( "Ring added" ) );
83-
int addRingReturnCode = vlayer->addRing( points() );
85+
86+
//does compoundcurve contain circular strings?
87+
//does provider support circular strings?
88+
bool hasCurvedSegments = captureCurve()->hasCurvedSegments();
89+
bool providerSupportsCurvedSegments = vlayer->dataProvider()->capabilities() & QgsVectorDataProvider::CircularGeometries;
90+
91+
QgsCurveV2* curveToAdd = 0;
92+
if ( hasCurvedSegments && providerSupportsCurvedSegments )
93+
{
94+
curveToAdd = dynamic_cast<QgsCurveV2*>( captureCurve()->clone() );
95+
}
96+
else
97+
{
98+
curveToAdd = captureCurve()->curveToLine();
99+
}
100+
101+
int addRingReturnCode = vlayer->addRing( curveToAdd );
84102
if ( addRingReturnCode != 0 )
85103
{
86104
QString errorMessage;

0 commit comments

Comments
 (0)
Please sign in to comment.