Skip to content

Commit dd223d9

Browse files
committedNov 24, 2017
Allow transform methods in QgsAbstractGeometry/QgsGeometry to also
transform z/m values via scale/translate arguments
1 parent 2b5aca5 commit dd223d9

24 files changed

+135
-78
lines changed
 

‎python/core/geometry/qgsabstractgeometry.sip

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -234,10 +234,13 @@ class QgsAbstractGeometry
234234
transform.
235235
%End
236236

237-
virtual void transform( const QTransform &t ) = 0;
237+
virtual void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0,
238+
double mTranslate = 0.0, double mScale = 1.0 ) = 0;
238239
%Docstring
239-
Transforms the geometry using a QTransform object
240-
\param t QTransform transformation
240+
Transforms the x and y components of the geometry using a QTransform object ``t``.
241+
242+
Optionally, the geometry's z values can be scaled via ``zScale`` and translated via ``zTranslate``.
243+
Similarly, m-values can be scaled via ``mScale`` and translated via ``mTranslate``.
241244
%End
242245

243246
virtual void draw( QPainter &p ) const = 0;

‎python/core/geometry/qgscircularstring.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class QgsCircularString: QgsCurve
8787

8888
virtual void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
8989
bool transformZ = false );
90-
virtual void transform( const QTransform &t );
90+
virtual void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 );
9191

9292
virtual void addToPainterPath( QPainterPath &path ) const;
9393

‎python/core/geometry/qgscompoundcurve.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class QgsCompoundCurve: QgsCurve
112112

113113
virtual void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
114114
bool transformZ = false );
115-
virtual void transform( const QTransform &t );
115+
virtual void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 );
116116

117117
virtual void addToPainterPath( QPainterPath &path ) const;
118118

‎python/core/geometry/qgscurvepolygon.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ Adds an interior ring to the geometry (takes ownership)
131131

132132
virtual void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
133133
bool transformZ = false );
134-
virtual void transform( const QTransform &t );
134+
virtual void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 );
135135

136136

137137
virtual bool insertVertex( QgsVertexId position, const QgsPoint &vertex );

‎python/core/geometry/qgsgeometry.sip

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -566,9 +566,9 @@ Returns true if WKB of the geometry is of WKBMulti* type
566566
:rtype: QgsGeometry
567567
%End
568568

569-
OperationResult translate( double dx, double dy );
569+
OperationResult translate( double dx, double dy, double dz = 0.0, double dm = 0.0 );
570570
%Docstring
571-
Translates this geometry by dx, dy
571+
Translates this geometry by dx, dy, dz and dm.
572572
:return: OperationResult a result code: success or reason of failure
573573
:rtype: OperationResult
574574
%End
@@ -580,9 +580,13 @@ Returns true if WKB of the geometry is of WKBMulti* type
580580
:rtype: OperationResult
581581
%End
582582

583-
OperationResult transform( const QTransform &ct );
583+
OperationResult transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 );
584584
%Docstring
585-
Transforms this geometry as described by QTransform ct
585+
Transforms the x and y components of the geometry using a QTransform object ``t``.
586+
587+
Optionally, the geometry's z values can be scaled via ``zScale`` and translated via ``zTranslate``.
588+
Similarly, m-values can be scaled via ``mScale`` and translated via ``mTranslate``.
589+
586590
:return: OperationResult a result code: success or reason of failure
587591
:rtype: OperationResult
588592
%End

‎python/core/geometry/qgsgeometrycollection.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ Adds a geometry and takes ownership. Returns true in case of success.
8383

8484
virtual void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
8585
bool transformZ = false );
86-
virtual void transform( const QTransform &t );
86+
virtual void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 );
8787

8888

8989
virtual void draw( QPainter &p ) const;

‎python/core/geometry/qgslinestring.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ Closes the line string by appending the first point to the end of the line, if i
225225

226226
virtual void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
227227
bool transformZ = false );
228-
virtual void transform( const QTransform &t );
228+
virtual void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 );
229229

230230

231231
virtual void addToPainterPath( QPainterPath &path ) const;

‎python/core/geometry/qgspoint.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ class QgsPoint: QgsAbstractGeometry
359359

360360
virtual void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
361361
bool transformZ = false );
362-
virtual void transform( const QTransform &t );
362+
virtual void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 );
363363

364364
virtual QgsCoordinateSequence coordinateSequence() const;
365365

‎src/core/geometry/qgsabstractgeometry.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,10 +262,13 @@ class CORE_EXPORT QgsAbstractGeometry
262262
bool transformZ = false ) = 0;
263263

264264
/**
265-
* Transforms the geometry using a QTransform object
266-
* \param t QTransform transformation
265+
* Transforms the x and y components of the geometry using a QTransform object \a t.
266+
*
267+
* Optionally, the geometry's z values can be scaled via \a zScale and translated via \a zTranslate.
268+
* Similarly, m-values can be scaled via \a mScale and translated via \a mTranslate.
267269
*/
268-
virtual void transform( const QTransform &t ) = 0;
270+
virtual void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0,
271+
double mTranslate = 0.0, double mScale = 1.0 ) = 0;
269272

270273
/**
271274
* Draws the geometry using the specified QPainter.

‎src/core/geometry/qgscircularstring.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,17 +559,27 @@ void QgsCircularString::transform( const QgsCoordinateTransform &ct, QgsCoordina
559559
}
560560
}
561561

562-
void QgsCircularString::transform( const QTransform &t )
562+
void QgsCircularString::transform( const QTransform &t, double zTranslate, double zScale, double mTranslate, double mScale )
563563
{
564564
clearCache();
565565

566566
int nPoints = numPoints();
567+
bool hasZ = is3D();
568+
bool hasM = isMeasure();
567569
for ( int i = 0; i < nPoints; ++i )
568570
{
569571
qreal x, y;
570572
t.map( mX.at( i ), mY.at( i ), &x, &y );
571573
mX[i] = x;
572574
mY[i] = y;
575+
if ( hasZ )
576+
{
577+
mZ[i] = mZ.at( i ) * zScale + zTranslate;
578+
}
579+
if ( hasM )
580+
{
581+
mM[i] = mM.at( i ) * mScale + mTranslate;
582+
}
573583
}
574584
}
575585

‎src/core/geometry/qgscircularstring.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class CORE_EXPORT QgsCircularString: public QgsCurve
7676
void draw( QPainter &p ) const override;
7777
void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
7878
bool transformZ = false ) override;
79-
void transform( const QTransform &t ) override;
79+
void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override;
8080
void addToPainterPath( QPainterPath &path ) const override;
8181
void drawAsPolygon( QPainter &p ) const override;
8282
bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) override;

‎src/core/geometry/qgscompoundcurve.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -509,11 +509,11 @@ void QgsCompoundCurve::transform( const QgsCoordinateTransform &ct, QgsCoordinat
509509
clearCache();
510510
}
511511

512-
void QgsCompoundCurve::transform( const QTransform &t )
512+
void QgsCompoundCurve::transform( const QTransform &t, double zTranslate, double zScale, double mTranslate, double mScale )
513513
{
514514
for ( QgsCurve *curve : qgis::as_const( mCurves ) )
515515
{
516-
curve->transform( t );
516+
curve->transform( t, zTranslate, zScale, mTranslate, mScale );
517517
}
518518
clearCache();
519519
}

‎src/core/geometry/qgscompoundcurve.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class CORE_EXPORT QgsCompoundCurve: public QgsCurve
9999
void draw( QPainter &p ) const override;
100100
void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
101101
bool transformZ = false ) override;
102-
void transform( const QTransform &t ) override;
102+
void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override;
103103
void addToPainterPath( QPainterPath &path ) const override;
104104
void drawAsPolygon( QPainter &p ) const override;
105105
bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) override;

‎src/core/geometry/qgscurvepolygon.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -704,16 +704,16 @@ void QgsCurvePolygon::transform( const QgsCoordinateTransform &ct, QgsCoordinate
704704
clearCache();
705705
}
706706

707-
void QgsCurvePolygon::transform( const QTransform &t )
707+
void QgsCurvePolygon::transform( const QTransform &t, double zTranslate, double zScale, double mTranslate, double mScale )
708708
{
709709
if ( mExteriorRing )
710710
{
711-
mExteriorRing->transform( t );
711+
mExteriorRing->transform( t, zTranslate, zScale, mTranslate, mScale );
712712
}
713713

714714
for ( QgsCurve *curve : qgis::as_const( mInteriorRings ) )
715715
{
716-
curve->transform( t );
716+
curve->transform( t, zTranslate, zScale, mTranslate, mScale );
717717
}
718718
clearCache();
719719
}

‎src/core/geometry/qgscurvepolygon.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class CORE_EXPORT QgsCurvePolygon: public QgsSurface
111111
void draw( QPainter &p ) const override;
112112
void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
113113
bool transformZ = false ) override;
114-
void transform( const QTransform &t ) override;
114+
void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override;
115115

116116
bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) override;
117117
bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) override;

‎src/core/geometry/qgsgeometry.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -752,7 +752,7 @@ QgsGeometry::OperationResult QgsGeometry::addPart( GEOSGeometry *newPart )
752752
return QgsGeometryEditUtils::addPart( d->geometry.get(), std::move( geom ) );
753753
}
754754

755-
QgsGeometry::OperationResult QgsGeometry::translate( double dx, double dy )
755+
QgsGeometry::OperationResult QgsGeometry::translate( double dx, double dy, double dz, double dm )
756756
{
757757
if ( !d->geometry )
758758
{
@@ -761,7 +761,7 @@ QgsGeometry::OperationResult QgsGeometry::translate( double dx, double dy )
761761

762762
detach();
763763

764-
d->geometry->transform( QTransform::fromTranslate( dx, dy ) );
764+
d->geometry->transform( QTransform::fromTranslate( dx, dy ), dz, 1.0, dm );
765765
return QgsGeometry::Success;
766766
}
767767

@@ -2308,15 +2308,15 @@ QgsGeometry::OperationResult QgsGeometry::transform( const QgsCoordinateTransfor
23082308
return QgsGeometry::Success;
23092309
}
23102310

2311-
QgsGeometry::OperationResult QgsGeometry::transform( const QTransform &ct )
2311+
QgsGeometry::OperationResult QgsGeometry::transform( const QTransform &ct, double zTranslate, double zScale, double mTranslate, double mScale )
23122312
{
23132313
if ( !d->geometry )
23142314
{
23152315
return QgsGeometry::InvalidBaseGeometry;
23162316
}
23172317

23182318
detach();
2319-
d->geometry->transform( ct );
2319+
d->geometry->transform( ct, zTranslate, zScale, mTranslate, mScale );
23202320
return QgsGeometry::Success;
23212321
}
23222322

‎src/core/geometry/qgsgeometry.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -624,10 +624,10 @@ class CORE_EXPORT QgsGeometry
624624
QgsGeometry removeInteriorRings( double minimumAllowedArea = -1 ) const;
625625

626626
/**
627-
* Translates this geometry by dx, dy
627+
* Translates this geometry by dx, dy, dz and dm.
628628
* \returns OperationResult a result code: success or reason of failure
629629
*/
630-
OperationResult translate( double dx, double dy );
630+
OperationResult translate( double dx, double dy, double dz = 0.0, double dm = 0.0 );
631631

632632
/**
633633
* Transforms this geometry as described by CoordinateTransform ct
@@ -636,10 +636,14 @@ class CORE_EXPORT QgsGeometry
636636
OperationResult transform( const QgsCoordinateTransform &ct );
637637

638638
/**
639-
* Transforms this geometry as described by QTransform ct
639+
* Transforms the x and y components of the geometry using a QTransform object \a t.
640+
*
641+
* Optionally, the geometry's z values can be scaled via \a zScale and translated via \a zTranslate.
642+
* Similarly, m-values can be scaled via \a mScale and translated via \a mTranslate.
643+
*
640644
* \returns OperationResult a result code: success or reason of failure
641645
*/
642-
OperationResult transform( const QTransform &ct );
646+
OperationResult transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 );
643647

644648
/**
645649
* Rotate this geometry around the Z axis

‎src/core/geometry/qgsgeometrycollection.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,11 +241,11 @@ void QgsGeometryCollection::transform( const QgsCoordinateTransform &ct, QgsCoor
241241
clearCache(); //set bounding box invalid
242242
}
243243

244-
void QgsGeometryCollection::transform( const QTransform &t )
244+
void QgsGeometryCollection::transform( const QTransform &t, double zTranslate, double zScale, double mTranslate, double mScale )
245245
{
246246
for ( QgsAbstractGeometry *g : qgis::as_const( mGeometries ) )
247247
{
248-
g->transform( t );
248+
g->transform( t, zTranslate, zScale, mTranslate, mScale );
249249
}
250250
clearCache(); //set bounding box invalid
251251
}

‎src/core/geometry/qgsgeometrycollection.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class CORE_EXPORT QgsGeometryCollection: public QgsAbstractGeometry
8888

8989
void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
9090
bool transformZ = false ) override;
91-
void transform( const QTransform &t ) override;
91+
void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override;
9292

9393
void draw( QPainter &p ) const override;
9494

‎src/core/geometry/qgslinestring.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -772,15 +772,25 @@ void QgsLineString::transform( const QgsCoordinateTransform &ct, QgsCoordinateTr
772772
clearCache();
773773
}
774774

775-
void QgsLineString::transform( const QTransform &t )
775+
void QgsLineString::transform( const QTransform &t, double zTranslate, double zScale, double mTranslate, double mScale )
776776
{
777777
int nPoints = numPoints();
778+
bool hasZ = is3D();
779+
bool hasM = isMeasure();
778780
for ( int i = 0; i < nPoints; ++i )
779781
{
780782
qreal x, y;
781783
t.map( mX.at( i ), mY.at( i ), &x, &y );
782784
mX[i] = x;
783785
mY[i] = y;
786+
if ( hasZ )
787+
{
788+
mZ[i] = mZ.at( i ) * zScale + zTranslate;
789+
}
790+
if ( hasM )
791+
{
792+
mM[i] = mM.at( i ) * mScale + mTranslate;
793+
}
784794
}
785795
clearCache();
786796
}

‎src/core/geometry/qgslinestring.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ class CORE_EXPORT QgsLineString: public QgsCurve
210210

211211
void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
212212
bool transformZ = false ) override;
213-
void transform( const QTransform &t ) override;
213+
void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override;
214214

215215
void addToPainterPath( QPainterPath &path ) const override;
216216
void drawAsPolygon( QPainter &p ) const override;

‎src/core/geometry/qgspoint.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,13 +494,22 @@ bool QgsPoint::addMValue( double mValue )
494494
return true;
495495
}
496496

497-
void QgsPoint::transform( const QTransform &t )
497+
void QgsPoint::transform( const QTransform &t, double zTranslate, double zScale, double mTranslate, double mScale )
498498
{
499499
clearCache();
500500
qreal x, y;
501501
t.map( mX, mY, &x, &y );
502502
mX = x;
503503
mY = y;
504+
505+
if ( is3D() )
506+
{
507+
mZ = mZ * zScale + zTranslate;
508+
}
509+
if ( isMeasure() )
510+
{
511+
mM = mM * mScale + mTranslate;
512+
}
504513
}
505514

506515

‎src/core/geometry/qgspoint.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ class CORE_EXPORT QgsPoint: public QgsAbstractGeometry
403403
void draw( QPainter &p ) const override;
404404
void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
405405
bool transformZ = false ) override;
406-
void transform( const QTransform &t ) override;
406+
void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override;
407407
QgsCoordinateSequence coordinateSequence() const override;
408408
int nCoordinates() const override;
409409
int vertexNumberFromVertexId( QgsVertexId id ) const override;

0 commit comments

Comments
 (0)