Skip to content

Commit 31e93ae

Browse files
committedFeb 12, 2018
[dxf] use a struct instead of QPair for layers
there was a crash in Python in QgsDxfExport.addLayers due to a bad conversion
1 parent 9e79d8a commit 31e93ae

File tree

7 files changed

+54
-23
lines changed

7 files changed

+54
-23
lines changed
 

‎python/core/dxf/qgsdxfexport.sip.in

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@ class QgsDxfExport
2020
#include "qgsdxfexport.h"
2121
%End
2222
public:
23+
24+
struct DxfLayer
25+
{
26+
DxfLayer( QgsVectorLayer *vl, int layerOutputAttributeIndex = -1 );
27+
28+
QgsVectorLayer *layer() const;
29+
int layerOutputAttributeIndex() const;
30+
31+
QgsVectorLayer *mLayer;
32+
int mLayerOutputAttributeIndex;
33+
};
34+
2335
enum SymbologyExport
2436
{
2537
NoSymbology,
@@ -64,7 +76,7 @@ Returns the export flags.
6476
.. seealso:: :py:func:`setFlags`
6577
%End
6678

67-
void addLayers( const QList< QPair<QgsVectorLayer *, int > > &layers );
79+
void addLayers( const QList< QgsDxfExport::DxfLayer > &layers );
6880
%Docstring
6981
Add layers to export
7082

‎src/app/main.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,15 +1357,15 @@ int main( int argc, char *argv[] )
13571357
dxfExport.setExtent( dxfExtent );
13581358

13591359
QStringList layerIds;
1360-
QList< QPair<QgsVectorLayer *, int > > layers;
1360+
QList< QgsDxfExport::DxfLayer > layers;
13611361
if ( !dxfMapTheme.isEmpty() )
13621362
{
13631363
Q_FOREACH ( QgsMapLayer *layer, QgsProject::instance()->mapThemeCollection()->mapThemeVisibleLayers( dxfMapTheme ) )
13641364
{
13651365
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer );
13661366
if ( !vl )
13671367
continue;
1368-
layers << qMakePair<QgsVectorLayer *, int>( vl, -1 );
1368+
layers << QgsDxfExport::DxfLayer( vl );
13691369
layerIds << vl->id();
13701370
}
13711371
}
@@ -1376,7 +1376,7 @@ int main( int argc, char *argv[] )
13761376
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( ml );
13771377
if ( !vl )
13781378
continue;
1379-
layers << qMakePair<QgsVectorLayer *, int>( vl, -1 );
1379+
layers << QgsDxfExport::DxfLayer( vl );
13801380
layerIds << vl->id();
13811381
}
13821382
}

‎src/app/qgsdxfexportdialog.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -276,9 +276,9 @@ bool QgsVectorLayerAndAttributeModel::setData( const QModelIndex &index, const Q
276276
}
277277

278278

279-
QList< QPair<QgsVectorLayer *, int> > QgsVectorLayerAndAttributeModel::layers() const
279+
QList< QgsDxfExport::DxfLayer > QgsVectorLayerAndAttributeModel::layers() const
280280
{
281-
QList< QPair<QgsVectorLayer *, int> > layers;
281+
QList< QgsDxfExport::DxfLayer > layers;
282282
QHash< QString, int > layerIdx;
283283

284284
Q_FOREACH ( const QModelIndex &idx, mCheckedLeafs )
@@ -293,7 +293,7 @@ QList< QPair<QgsVectorLayer *, int> > QgsVectorLayerAndAttributeModel::layers()
293293
if ( !layerIdx.contains( vl->id() ) )
294294
{
295295
layerIdx.insert( vl->id(), layers.size() );
296-
layers << qMakePair<QgsVectorLayer *, int>( vl, mAttributeIdx.value( vl, -1 ) );
296+
layers << QgsDxfExport::DxfLayer( vl, mAttributeIdx.value( vl, -1 ) );
297297
}
298298
}
299299
}
@@ -304,12 +304,12 @@ QList< QPair<QgsVectorLayer *, int> > QgsVectorLayerAndAttributeModel::layers()
304304
if ( !layerIdx.contains( vl->id() ) )
305305
{
306306
layerIdx.insert( vl->id(), layers.size() );
307-
layers << qMakePair<QgsVectorLayer *, int>( vl, mAttributeIdx.value( vl, -1 ) );
307+
layers << QgsDxfExport::DxfLayer( vl, mAttributeIdx.value( vl, -1 ) );
308308
}
309309
}
310310
}
311311

312-
QList< QPair<QgsVectorLayer *, int> > layersInROrder;
312+
QList< QgsDxfExport::DxfLayer > layersInROrder;
313313

314314
QList<QgsMapLayer *> layerOrder = mRootNode->layerOrder();
315315

@@ -549,7 +549,7 @@ void QgsDxfExportDialog::deSelectAll()
549549
}
550550

551551

552-
QList< QPair<QgsVectorLayer *, int> > QgsDxfExportDialog::layers() const
552+
QList< QgsDxfExport::DxfLayer > QgsDxfExportDialog::layers() const
553553
{
554554
const QgsVectorLayerAndAttributeModel *model = dynamic_cast< const QgsVectorLayerAndAttributeModel *>( mTreeView->model() );
555555
Q_ASSERT( model );

‎src/app/qgsdxfexportdialog.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class QgsVectorLayerAndAttributeModel : public QgsLayerTreeModel
5353
Qt::ItemFlags flags( const QModelIndex &index ) const override;
5454
bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override;
5555

56-
QList< QPair<QgsVectorLayer *, int> > layers() const;
56+
QList< QgsDxfExport::DxfLayer > layers() const;
5757

5858
QgsVectorLayer *vectorLayer( const QModelIndex &index ) const;
5959
int attributeIndex( const QgsVectorLayer *vl ) const;
@@ -79,7 +79,7 @@ class QgsDxfExportDialog : public QDialog, private Ui::QgsDxfExportDialogBase
7979
QgsDxfExportDialog( QWidget *parent = nullptr, Qt::WindowFlags f = nullptr );
8080
~QgsDxfExportDialog() override;
8181

82-
QList< QPair<QgsVectorLayer *, int> > layers() const;
82+
QList< QgsDxfExport::DxfLayer > layers() const;
8383

8484
double symbologyScale() const;
8585
QgsDxfExport::SymbologyExport symbologyMode() const;

‎src/core/dxf/qgsdxfexport.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -398,18 +398,18 @@ QgsDxfExport::Flags QgsDxfExport::flags() const
398398
return mFlags;
399399
}
400400

401-
void QgsDxfExport::addLayers( const QList< QPair< QgsVectorLayer *, int > > &layers )
401+
void QgsDxfExport::addLayers( const QList<DxfLayer> &layers )
402402
{
403403
QList<QgsMapLayer *> layerList;
404404

405405
mLayerNameAttribute.clear();
406406

407-
QList< QPair< QgsVectorLayer *, int > >::const_iterator layerIt = layers.constBegin();
407+
QList< DxfLayer >::const_iterator layerIt = layers.constBegin();
408408
for ( ; layerIt != layers.constEnd(); ++layerIt )
409409
{
410-
layerList << layerIt->first;
411-
if ( layerIt->second >= 0 )
412-
mLayerNameAttribute.insert( layerIt->first->id(), layerIt->second );
410+
layerList << layerIt->layer();
411+
if ( layerIt->layerOutputAttributeIndex() >= 0 )
412+
mLayerNameAttribute.insert( layerIt->layer()->id(), layerIt->layerOutputAttributeIndex() );
413413
}
414414

415415
mMapSettings.setLayers( layerList );

‎src/core/dxf/qgsdxfexport.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,25 @@ namespace pal SIP_SKIP
5151
class CORE_EXPORT QgsDxfExport
5252
{
5353
public:
54+
55+
/**
56+
* Layers and optional attribute index to split
57+
* into multiple layers using attribute value as layer name.
58+
*/
59+
struct DxfLayer
60+
{
61+
DxfLayer( QgsVectorLayer *vl, int layerOutputAttributeIndex = -1 )
62+
: mLayer( vl )
63+
, mLayerOutputAttributeIndex( layerOutputAttributeIndex )
64+
{}
65+
66+
QgsVectorLayer *layer() const {return mLayer;}
67+
int layerOutputAttributeIndex() const {return mLayerOutputAttributeIndex;}
68+
69+
QgsVectorLayer *mLayer;
70+
int mLayerOutputAttributeIndex;
71+
};
72+
5473
enum SymbologyExport
5574
{
5675
NoSymbology = 0, //!< Export only data
@@ -97,7 +116,7 @@ class CORE_EXPORT QgsDxfExport
97116
* \param layers list of layers and corresponding attribute indexes that determine the layer name (-1 for original layer name or title)
98117
* \see setLayerTitleAsName
99118
*/
100-
void addLayers( const QList< QPair<QgsVectorLayer *, int > > &layers );
119+
void addLayers( const QList< QgsDxfExport::DxfLayer > &layers );
101120

102121
/**
103122
* Export to a dxf file in the given encoding

‎tests/src/core/testqgsdxfexport.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void TestQgsDxfExport::cleanup()
9494
void TestQgsDxfExport::testPoints()
9595
{
9696
QgsDxfExport d;
97-
d.addLayers( QList< QPair< QgsVectorLayer *, int > >() << qMakePair( mPointLayer, -1 ) );
97+
d.addLayers( QList< QgsDxfExport::DxfLayer >() << QgsDxfExport::DxfLayer( mPointLayer ) );
9898

9999
QgsMapSettings mapSettings;
100100
QSize size( 640, 480 );
@@ -122,7 +122,7 @@ void TestQgsDxfExport::testPoints()
122122
void TestQgsDxfExport::testLines()
123123
{
124124
QgsDxfExport d;
125-
d.addLayers( QList< QPair< QgsVectorLayer *, int > >() << qMakePair( mLineLayer, -1 ) );
125+
d.addLayers( QList< QgsDxfExport::DxfLayer >() << QgsDxfExport::DxfLayer( mLineLayer ) );
126126

127127
QgsMapSettings mapSettings;
128128
QSize size( 640, 480 );
@@ -150,7 +150,7 @@ void TestQgsDxfExport::testLines()
150150
void TestQgsDxfExport::testPolygons()
151151
{
152152
QgsDxfExport d;
153-
d.addLayers( QList< QPair< QgsVectorLayer *, int > >() << qMakePair( mPolygonLayer, -1 ) );
153+
d.addLayers( QList< QgsDxfExport::DxfLayer >() << QgsDxfExport::DxfLayer( mPolygonLayer ) );
154154

155155
QgsMapSettings mapSettings;
156156
QSize size( 640, 480 );
@@ -189,7 +189,7 @@ void TestQgsDxfExport::testMtext()
189189
mPointLayer->setLabelsEnabled( true );
190190

191191
QgsDxfExport d;
192-
d.addLayers( QList< QPair< QgsVectorLayer *, int > >() << qMakePair( mPointLayer, -1 ) );
192+
d.addLayers( QList< QgsDxfExport::DxfLayer >() << QgsDxfExport::DxfLayer( mPointLayer ) );
193193

194194
QgsMapSettings mapSettings;
195195
QSize size( 640, 480 );
@@ -251,7 +251,7 @@ void TestQgsDxfExport::testText()
251251
mPointLayer->setLabelsEnabled( true );
252252

253253
QgsDxfExport d;
254-
d.addLayers( QList< QPair< QgsVectorLayer *, int > >() << qMakePair( mPointLayer, -1 ) );
254+
d.addLayers( QList< QgsDxfExport::DxfLayer >() << QgsDxfExport::DxfLayer( mPointLayer ) );
255255

256256
QgsMapSettings mapSettings;
257257
QSize size( 640, 480 );

0 commit comments

Comments
 (0)
Please sign in to comment.