Skip to content

Commit 12183e9

Browse files
PeterPetrikwonder-sk
authored andcommittedMay 3, 2018
Fix reading/writing of mesh layer to a qgis project (fixes #18801) (PR #6869)
* fix guard header * [bugfix] Fix reading/writing of mesh layer to a qgis project #18801 * fix copy-paste error * fix copy-paste error * extract decode source to derived classes * remove raster providers from vector decode source * reset testdata to master
1 parent 5c93666 commit 12183e9

15 files changed

+513
-289
lines changed
 

‎python/core/mesh/qgsmeshlayer.sip.in

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,14 @@ QgsMeshLayer cannot be copied.
100100

101101
virtual bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const;
102102

103+
virtual QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const;
104+
105+
virtual QString decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const;
106+
107+
virtual bool readXml( const QDomNode &layer_node, QgsReadWriteContext &context );
108+
109+
virtual bool writeXml( QDomNode &layer_node, QDomDocument &doc, const QgsReadWriteContext &context ) const;
110+
103111

104112
QString providerType() const;
105113
%Docstring

‎python/core/qgsmaplayer.sip.in

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1376,6 +1376,35 @@ project files.
13761376
%Docstring
13771377
Called by writeLayerXML(), used by children to write state specific to them to
13781378
project files.
1379+
%End
1380+
1381+
virtual QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const;
1382+
%Docstring
1383+
Called by writeLayerXML(), used by derived classes to encode provider's specific data
1384+
source to project files. Typically resolving absolute or relative paths, usernames and
1385+
passwords or drivers prefixes ("HDF5:")
1386+
1387+
:param source: data source to encode, typically :py:func:`QgsMapLayer.source()`
1388+
:param context: writing context (e.g. for conversion between relative and absolute paths)
1389+
1390+
:return: encoded source, typically to be written in the dom element "datasource"
1391+
1392+
.. versionadded:: 3.2
1393+
%End
1394+
1395+
virtual QString decodedSource( const QString &source, const QString &dataProvider, const QgsReadWriteContext &context ) const;
1396+
%Docstring
1397+
Called by readLayerXML(), used by derived classes to decode provider's specific data
1398+
source from project files. Typically resolving absolute or relative paths, usernames and
1399+
passwords or drivers prefixes ("HDF5:")
1400+
1401+
:param source: data source to decode, typically read from layer's dom element "datasource"
1402+
:param dataProvider: string identification of data provider (e.g. "ogr"), typically read from layer's dom element
1403+
:param context: reading context (e.g. for conversion between relative and absolute paths)
1404+
1405+
:return: decoded source, typically to be used as the layer's datasource
1406+
1407+
.. versionadded:: 3.2
13791408
%End
13801409

13811410
void readCustomProperties( const QDomNode &layerNode, const QString &keyStartsWith = QString() );

‎python/core/qgsvectorlayer.sip.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,11 @@ Write vector layer specific state to project file Dom node.
748748
Called by :py:func:`QgsMapLayer.writeXml()`
749749
%End
750750

751+
virtual QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const;
752+
753+
virtual QString decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const;
754+
755+
751756
virtual void resolveReferences( QgsProject *project );
752757

753758
%Docstring

‎python/core/raster/qgsrasterlayer.sip.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,9 @@ In a world file, this is normally the first row (without the sign).
347347

348348
virtual bool writeXml( QDomNode &layer_node, QDomDocument &doc, const QgsReadWriteContext &context ) const;
349349

350+
virtual QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const;
351+
352+
virtual QString decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const;
350353

351354
};
352355

‎src/core/mesh/qgsmeshlayer.cpp

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "qgsmeshlayer.h"
2626
#include "qgsmeshlayerrenderer.h"
2727
#include "qgsproviderregistry.h"
28+
#include "qgsreadwritecontext.h"
2829
#include "qgstriangularmesh.h"
2930

3031
QgsMeshLayer::QgsMeshLayer( const QString &meshLayerPath,
@@ -180,9 +181,84 @@ bool QgsMeshLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString &e
180181
return true;
181182
}
182183

184+
QString QgsMeshLayer::decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const
185+
{
186+
QString src( source );
187+
if ( provider == QLatin1String( "mdal" ) )
188+
{
189+
src = context.pathResolver().readPath( src );
190+
}
191+
return src;
192+
}
193+
194+
QString QgsMeshLayer::encodedSource( const QString &source, const QgsReadWriteContext &context ) const
195+
{
196+
QString src( source );
197+
if ( providerType() == QLatin1String( "mdal" ) )
198+
{
199+
src = context.pathResolver().writePath( src );
200+
}
201+
return src;
202+
}
203+
204+
bool QgsMeshLayer::readXml( const QDomNode &layer_node, QgsReadWriteContext &context )
205+
{
206+
Q_UNUSED( context );
207+
208+
QgsDebugMsgLevel( QStringLiteral( "Datasource in QgsMeshLayer::readXml: %1" ).arg( mDataSource.toLocal8Bit().data() ), 3 );
209+
210+
//process provider key
211+
QDomNode pkeyNode = layer_node.namedItem( QStringLiteral( "provider" ) );
212+
213+
if ( pkeyNode.isNull() )
214+
{
215+
mProviderKey.clear();
216+
}
217+
else
218+
{
219+
QDomElement pkeyElt = pkeyNode.toElement();
220+
mProviderKey = pkeyElt.text();
221+
}
222+
223+
if ( !setDataProvider( mProviderKey ) )
224+
{
225+
return false;
226+
}
227+
228+
return mValid; // should be true if read successfully
229+
}
230+
231+
bool QgsMeshLayer::writeXml( QDomNode &layer_node, QDomDocument &document, const QgsReadWriteContext &context ) const
232+
{
233+
// first get the layer element so that we can append the type attribute
234+
QDomElement mapLayerNode = layer_node.toElement();
235+
236+
if ( mapLayerNode.isNull() || ( "maplayer" != mapLayerNode.nodeName() ) )
237+
{
238+
QgsDebugMsgLevel( QStringLiteral( "can't find <maplayer>" ), 2 );
239+
return false;
240+
}
241+
242+
mapLayerNode.setAttribute( QStringLiteral( "type" ), QStringLiteral( "mesh" ) );
243+
244+
// add provider node
245+
if ( mDataProvider )
246+
{
247+
QDomElement provider = document.createElement( QStringLiteral( "provider" ) );
248+
QDomText providerText = document.createTextNode( providerType() );
249+
provider.appendChild( providerText );
250+
layer_node.appendChild( provider );
251+
}
252+
253+
// renderer specific settings
254+
QString errorMsg;
255+
return writeSymbology( layer_node, document, errorMsg, context );
256+
}
257+
183258
bool QgsMeshLayer::setDataProvider( QString const &provider )
184259
{
185-
Q_ASSERT( !mDataProvider ); //called from ctor
260+
if ( mDataProvider )
261+
delete mDataProvider;
186262

187263
mProviderKey = provider;
188264
QString dataSource = mDataSource;

‎src/core/mesh/qgsmeshlayer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer
114114
virtual QgsMapLayerRenderer *createMapRenderer( QgsRenderContext &rendererContext ) override SIP_FACTORY;
115115
bool readSymbology( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context ) override;
116116
bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context ) const override;
117+
QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const override;
118+
QString decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const override;
119+
bool readXml( const QDomNode &layer_node, QgsReadWriteContext &context ) override;
120+
bool writeXml( QDomNode &layer_node, QDomDocument &doc, const QgsReadWriteContext &context ) const override;
117121

118122
//! Return the provider type for this layer
119123
QString providerType() const;

0 commit comments

Comments
 (0)
Please sign in to comment.