Skip to content

Commit

Permalink
Add support for QgsRemappingSinkDefinition to QgsXmlUtils
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Apr 7, 2020
1 parent 8c73c61 commit 28502a7
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 1 deletion.
20 changes: 20 additions & 0 deletions src/core/qgsxmlutils.cpp
Expand Up @@ -21,6 +21,7 @@
#include "qgsproperty.h"
#include "qgssymbollayerutils.h"
#include "qgsprocessingparameters.h"
#include "qgsremappingproxyfeaturesink.h"

QgsUnitTypes::DistanceUnit QgsXmlUtils::readMapUnits( const QDomElement &element )
{
Expand Down Expand Up @@ -228,6 +229,13 @@ QDomElement QgsXmlUtils::writeVariant( const QVariant &value, QDomDocument &doc
element.setAttribute( QStringLiteral( "type" ), QStringLiteral( "QgsProcessingFeatureSourceDefinition" ) );
break;
}
else if ( value.canConvert< QgsRemappingSinkDefinition >() )
{
QDomElement valueElement = writeVariant( value.value< QgsRemappingSinkDefinition >().toVariant(), doc );
element.appendChild( valueElement );
element.setAttribute( QStringLiteral( "type" ), QStringLiteral( "QgsRemappingSinkDefinition" ) );
break;
}
Q_ASSERT_X( false, "QgsXmlUtils::writeVariant", QStringLiteral( "unsupported user variant type %1" ).arg( QMetaType::typeName( value.userType() ) ).toLocal8Bit() );
break;
}
Expand Down Expand Up @@ -378,6 +386,18 @@ QVariant QgsXmlUtils::readVariant( const QDomElement &element )

return QVariant();
}
else if ( type == QLatin1String( "QgsRemappingSinkDefinition" ) )
{
QgsRemappingSinkDefinition res;
const QDomNodeList values = element.childNodes();
if ( values.isEmpty() )
return QVariant();

if ( res.loadVariant( QgsXmlUtils::readVariant( values.at( 0 ).toElement() ).toMap() ) )
return QVariant::fromValue( res );

return QVariant();
}
else
{
return QVariant();
Expand Down
34 changes: 33 additions & 1 deletion tests/src/python/test_qgsxmlutils.py
Expand Up @@ -18,9 +18,15 @@
QgsCoordinateReferenceSystem,
QgsProcessingOutputLayerDefinition,
QgsProcessingFeatureSourceDefinition,
QgsRemappingSinkDefinition,
QgsWkbTypes,
QgsCoordinateTransform,
QgsFields,
QgsField,
QgsProject,
NULL)

from qgis.PyQt.QtCore import QDateTime, QDate, QTime
from qgis.PyQt.QtCore import QDateTime, QDate, QTime, QVariant
from qgis.PyQt.QtXml import QDomDocument
from qgis.PyQt.QtGui import QColor

Expand Down Expand Up @@ -278,6 +284,32 @@ def test_output_layer_definition(self):
self.assertEqual(c.sink.staticValue(), 'my sink')
self.assertEqual(c.createOptions, {'opt': 1, 'opt2': 2})

def testRemappingDefinition(self):
fields = QgsFields()
fields.append(QgsField('fldtxt', QVariant.String))
fields.append(QgsField('fldint', QVariant.Int))
fields.append(QgsField('fldtxt2', QVariant.String))

mapping_def = QgsRemappingSinkDefinition()
mapping_def.setDestinationWkbType(QgsWkbTypes.Point)
mapping_def.setSourceCrs(QgsCoordinateReferenceSystem('EPSG:4326'))
mapping_def.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:3857'))
mapping_def.setDestinationFields(fields)
mapping_def.addMappedField('fldtxt2', QgsProperty.fromField('fld1'))
mapping_def.addMappedField('fldint', QgsProperty.fromExpression('@myval * fldint'))

doc = QDomDocument("properties")
elem = QgsXmlUtils.writeVariant(mapping_def, doc)
c = QgsXmlUtils.readVariant(elem)

self.assertEqual(c.destinationWkbType(), QgsWkbTypes.Point)
self.assertEqual(c.sourceCrs().authid(), 'EPSG:4326')
self.assertEqual(c.destinationCrs().authid(), 'EPSG:3857')
self.assertEqual(c.destinationFields()[0].name(), 'fldtxt')
self.assertEqual(c.destinationFields()[1].name(), 'fldint')
self.assertEqual(c.fieldMap()['fldtxt2'].field(), 'fld1')
self.assertEqual(c.fieldMap()['fldint'].expressionString(), '@myval * fldint')


if __name__ == '__main__':
unittest.main()

0 comments on commit 28502a7

Please sign in to comment.