diff --git a/doc/api_break.dox b/doc/api_break.dox index fb3bb150f11..22c35ec849a 100644 --- a/doc/api_break.dox +++ b/doc/api_break.dox @@ -960,6 +960,7 @@ QgsDatumTransformStore {#qgis_api_break_3_0_QgsDatumTransformStore} - transformation() now returns a QgsCoordinateTransform object, not a pointer. An invalid QgsCoordinateTransform will be returned in place of a null pointer. +- transformation() also optional source and destination authid parameters QgsDiagram {#qgis_api_break_3_0_QgsDiagram} diff --git a/python/core/qgsdatumtransformstore.sip b/python/core/qgsdatumtransformstore.sip index 54a306d1baa..fe7936e5c01 100644 --- a/python/core/qgsdatumtransformstore.sip +++ b/python/core/qgsdatumtransformstore.sip @@ -36,12 +36,13 @@ class QgsDatumTransformStore :rtype: bool %End - QgsCoordinateTransform transformation( const QgsMapLayer *layer ) const; + QgsCoordinateTransform transformation( const QgsMapLayer *layer, QString srcAuthId = QString(), QString dstAuthId = QString() ) const; %Docstring Will return transform from layer's CRS to current destination CRS. - Will emit datumTransformInfoRequested signal if the layer has no entry. :return: transformation associated with layer, or an invalid QgsCoordinateTransform if no transform is associated with the layer + \param srcAuthId source CRS (defaults to layer crs) + \param dstAuthId destination CRS (defaults to store's crs) :rtype: QgsCoordinateTransform %End diff --git a/python/gui/qgsmapcanvas.sip b/python/gui/qgsmapcanvas.sip index ad8d1199000..2fff0b77c91 100644 --- a/python/gui/qgsmapcanvas.sip +++ b/python/gui/qgsmapcanvas.sip @@ -853,6 +853,7 @@ called when panning is in action, reset indicates end of panning + void updateDatumTransformEntries(); %Docstring Make sure the datum transform store is properly populated diff --git a/src/app/qgsclipboard.cpp b/src/app/qgsclipboard.cpp index f217fa9f0e7..9299b871821 100644 --- a/src/app/qgsclipboard.cpp +++ b/src/app/qgsclipboard.cpp @@ -36,6 +36,8 @@ #include "qgsogrutils.h" #include "qgsjsonutils.h" #include "qgssettings.h" +#include "qgisapp.h" +#include "qgsmapcanvas.h" QgsClipboard::QgsClipboard() : QObject() @@ -59,6 +61,9 @@ void QgsClipboard::replaceWithCopyOf( QgsVectorLayer *src ) mFeatureFields = src->fields(); mFeatureClipboard = src->selectedFeatures(); mCRS = src->crs(); + layerDestroyed(); + mSrcLayer = src; + connect( mSrcLayer, &QObject::destroyed, this, &QgsClipboard::layerDestroyed ); QgsDebugMsg( "replaced QGis clipboard." ); @@ -73,11 +78,19 @@ void QgsClipboard::replaceWithCopyOf( QgsFeatureStore &featureStore ) mFeatureFields = featureStore.fields(); mFeatureClipboard = featureStore.features(); mCRS = featureStore.crs(); + disconnect( mSrcLayer, &QObject::destroyed, this, &QgsClipboard::layerDestroyed ); + mSrcLayer = nullptr; setSystemClipboard(); mUseSystemClipboard = false; emit changed(); } +void QgsClipboard::layerDestroyed() +{ + disconnect( mSrcLayer, &QObject::destroyed, this, &QgsClipboard::layerDestroyed ); + mSrcLayer = nullptr; +} + QString QgsClipboard::generateClipboardText() const { QgsSettings settings; @@ -264,7 +277,17 @@ bool QgsClipboard::isEmpty() const QgsFeatureList QgsClipboard::transformedCopyOf( const QgsCoordinateReferenceSystem &destCRS, const QgsFields &fields ) const { QgsFeatureList featureList = copyOf( fields ); - QgsCoordinateTransform ct( crs(), destCRS ); + + QgsCoordinateTransform ct; + if ( mSrcLayer ) + { + QgisApp::instance()->mapCanvas()->getDatumTransformInfo( mSrcLayer, crs().authid(), destCRS.authid() ); + ct = QgisApp::instance()->mapCanvas()->mapSettings().datumTransformStore().transformation( mSrcLayer, crs().authid(), destCRS.authid() ); + } + else + { + ct = QgsCoordinateTransform( crs(), destCRS ); + } QgsDebugMsg( "transforming clipboard." ); for ( QgsFeatureList::iterator iter = featureList.begin(); iter != featureList.end(); ++iter ) diff --git a/src/app/qgsclipboard.h b/src/app/qgsclipboard.h index 2539a126809..598399d341f 100644 --- a/src/app/qgsclipboard.h +++ b/src/app/qgsclipboard.h @@ -148,6 +148,10 @@ class APP_EXPORT QgsClipboard : public QObject //! Emitted when content changed void changed(); + private slots: + //! source layer destroyed + void layerDestroyed(); + private: /** @@ -180,6 +184,7 @@ class APP_EXPORT QgsClipboard : public QObject QgsFeatureList mFeatureClipboard; QgsFields mFeatureFields; QgsCoordinateReferenceSystem mCRS; + QgsVectorLayer *mSrcLayer = nullptr; //! True when the data from the system clipboard should be read bool mUseSystemClipboard; diff --git a/src/core/qgsdatumtransformstore.cpp b/src/core/qgsdatumtransformstore.cpp index 3d3ad0baa28..38574cb1974 100644 --- a/src/core/qgsdatumtransformstore.cpp +++ b/src/core/qgsdatumtransformstore.cpp @@ -50,13 +50,15 @@ bool QgsDatumTransformStore::hasEntryForLayer( QgsMapLayer *layer ) const return mEntries.contains( layer->id() ); } -QgsCoordinateTransform QgsDatumTransformStore::transformation( const QgsMapLayer *layer ) const +QgsCoordinateTransform QgsDatumTransformStore::transformation( const QgsMapLayer *layer, QString srcAuthId, QString dstAuthId ) const { if ( !layer ) return QgsCoordinateTransform(); - QString srcAuthId = layer->crs().authid(); - QString dstAuthId = mDestCRS.authid(); + if ( srcAuthId.isEmpty() ) + srcAuthId = layer->crs().authid(); + if ( dstAuthId.isEmpty() ) + dstAuthId = mDestCRS.authid(); if ( srcAuthId == dstAuthId ) { diff --git a/src/core/qgsdatumtransformstore.h b/src/core/qgsdatumtransformstore.h index 0dfe43c7486..1adb91046ee 100644 --- a/src/core/qgsdatumtransformstore.h +++ b/src/core/qgsdatumtransformstore.h @@ -45,11 +45,12 @@ class CORE_EXPORT QgsDatumTransformStore /** * Will return transform from layer's CRS to current destination CRS. - * Will emit datumTransformInfoRequested signal if the layer has no entry. * \returns transformation associated with layer, or an invalid QgsCoordinateTransform * if no transform is associated with the layer + * \param srcAuthId source CRS (defaults to layer crs) + * \param dstAuthId destination CRS (defaults to store's crs) */ - QgsCoordinateTransform transformation( const QgsMapLayer *layer ) const; + QgsCoordinateTransform transformation( const QgsMapLayer *layer, QString srcAuthId = QString(), QString dstAuthId = QString() ) const; void readXml( const QDomNode &parentNode );