Skip to content

Commit

Permalink
Correctly store absolute/relative paths for point clouds in projects
Browse files Browse the repository at this point in the history
Fixes #42114
  • Loading branch information
nyalldawson committed Mar 10, 2021
1 parent 03edd71 commit ebdb7ba
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
Expand Up @@ -98,6 +98,10 @@ QgsPointCloudLayer cannot be copied.

virtual void setDataSource( const QString &dataSource, const QString &baseName, const QString &provider, const QgsDataProvider::ProviderOptions &options, bool loadDefaultStyleFlag = false );

virtual QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const;

virtual QString decodedSource( const QString &source, const QString &dataProvider, const QgsReadWriteContext &context ) const;

virtual QString loadDefaultStyle( bool &resultFlag /Out/ ) ${SIP_FINAL};

virtual QString htmlMetadata() const;
Expand Down
28 changes: 28 additions & 0 deletions src/core/pointcloud/qgspointcloudlayer.cpp
Expand Up @@ -360,6 +360,34 @@ void QgsPointCloudLayer::setDataSource( const QString &dataSource, const QString
triggerRepaint();
}

QString QgsPointCloudLayer::encodedSource( const QString &source, const QgsReadWriteContext &context ) const
{
QVariantMap parts = QgsProviderRegistry::instance()->decodeUri( providerType(), source );
if ( parts.contains( QStringLiteral( "path" ) ) )
{
parts.insert( QStringLiteral( "path" ), context.pathResolver().writePath( parts.value( QStringLiteral( "path" ) ).toString() ) );
return QgsProviderRegistry::instance()->encodeUri( providerType(), parts );
}
else
{
return source;
}
}

QString QgsPointCloudLayer::decodedSource( const QString &source, const QString &dataProvider, const QgsReadWriteContext &context ) const
{
QVariantMap parts = QgsProviderRegistry::instance()->decodeUri( dataProvider, source );
if ( parts.contains( QStringLiteral( "path" ) ) )
{
parts.insert( QStringLiteral( "path" ), context.pathResolver().readPath( parts.value( QStringLiteral( "path" ) ).toString() ) );
return QgsProviderRegistry::instance()->encodeUri( dataProvider, parts );
}
else
{
return source;
}
}

void QgsPointCloudLayer::onPointCloudIndexGenerationStateChanged( QgsPointCloudDataProvider::PointCloudIndexGenerationState state )
{
if ( state == QgsPointCloudDataProvider::Indexed )
Expand Down
2 changes: 2 additions & 0 deletions src/core/pointcloud/qgspointcloudlayer.h
Expand Up @@ -129,6 +129,8 @@ class CORE_EXPORT QgsPointCloudLayer : public QgsMapLayer

void setTransformContext( const QgsCoordinateTransformContext &transformContext ) override;
void setDataSource( const QString &dataSource, const QString &baseName, const QString &provider, const QgsDataProvider::ProviderOptions &options, bool loadDefaultStyleFlag = false ) override;
QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const override;
QString decodedSource( const QString &source, const QString &dataProvider, const QgsReadWriteContext &context ) const override;
QString loadDefaultStyle( bool &resultFlag SIP_OUT ) FINAL;
QString htmlMetadata() const override;
QgsMapLayerElevationProperties *elevationProperties() override;
Expand Down

0 comments on commit ebdb7ba

Please sign in to comment.