Skip to content

Commit 92091c5

Browse files
committed
dxf export: consider layer styles (fixes #15946)
1 parent bb2a6c8 commit 92091c5

File tree

6 files changed

+108
-48
lines changed

6 files changed

+108
-48
lines changed

python/core/dxf/qgsdxfexport.sip

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ class QgsDxfExport
3131
QgsDxfExport();
3232
~QgsDxfExport();
3333

34+
/**
35+
* Set map settings and assign layer name attributes
36+
* @param settings map settings to apply
37+
*/
38+
void setMapSettings( const QgsMapSettings &settings );
39+
3440
/**
3541
* Add layers to export
3642
* @param layers list of layers and corresponding attribute indexes that determine the layer name (-1 for original layer name or title)

src/app/qgisapp.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5212,6 +5212,10 @@ void QgisApp::dxfExport()
52125212
if ( d.exec() == QDialog::Accepted )
52135213
{
52145214
QgsDxfExport dxfExport;
5215+
5216+
QgsMapSettings settings( mapCanvas()->mapSettings() );
5217+
settings.setLayerStyleOverrides( QgsProject::instance()->mapThemeCollection()->mapThemeStyleOverrides( d.mapTheme() ) );
5218+
dxfExport.setMapSettings( settings );
52155219
dxfExport.addLayers( d.layers() );
52165220
dxfExport.setSymbologyScaleDenominator( d.symbologyScale() );
52175221
dxfExport.setSymbologyExport( d.symbologyMode() );

src/app/qgsdxfexportdialog.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,3 +638,8 @@ QgsCoordinateReferenceSystem QgsDxfExportDialog::crs() const
638638
{
639639
return mCRS;
640640
}
641+
642+
QString QgsDxfExportDialog::mapTheme() const
643+
{
644+
return mVisibilityPresets->currentText();
645+
}

src/app/qgsdxfexportdialog.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ class QgsDxfExportDialog : public QDialog, private Ui::QgsDxfExportDialogBase
8787
QString saveFile() const;
8888
bool exportMapExtent() const;
8989
bool layerTitleAsName() const;
90+
QString mapTheme() const;
9091
QString encoding() const;
9192
QgsCoordinateReferenceSystem crs() const;
9293

src/core/dxf/qgsdxfexport.cpp

Lines changed: 85 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "qgstextlabelfeature.h"
4242
#include "qgscrscache.h"
4343
#include "qgslogger.h"
44+
#include "qgsmaplayerstylemanager.h"
4445

4546
#include "qgswkbtypes.h"
4647
#include "qgspointv2.h"
@@ -382,9 +383,10 @@ QgsDxfExport::QgsDxfExport( const QgsDxfExport& dxfExport )
382383
*this = dxfExport;
383384
}
384385

385-
QgsDxfExport& QgsDxfExport::operator=( const QgsDxfExport & dxfExport )
386+
QgsDxfExport &QgsDxfExport::operator=( const QgsDxfExport & dxfExport )
386387
{
387-
mLayers = dxfExport.mLayers;
388+
mMapSettings = dxfExport.mMapSettings;
389+
mLayerNameAttribute = dxfExport.mLayerNameAttribute;
388390
mSymbologyScaleDenominator = dxfExport.mSymbologyScaleDenominator;
389391
mSymbologyExport = dxfExport.mSymbologyExport;
390392
mMapUnits = dxfExport.mMapUnits;
@@ -397,9 +399,26 @@ QgsDxfExport& QgsDxfExport::operator=( const QgsDxfExport & dxfExport )
397399
return *this;
398400
}
399401

402+
void QgsDxfExport::setMapSettings( const QgsMapSettings &settings )
403+
{
404+
mMapSettings = settings;
405+
}
406+
400407
void QgsDxfExport::addLayers( const QList< QPair< QgsVectorLayer *, int > > &layers )
401408
{
402-
mLayers = layers;
409+
QList<QgsMapLayer*> layerList;
410+
411+
mLayerNameAttribute.clear();
412+
413+
QList< QPair< QgsVectorLayer*, int > >::const_iterator layerIt = layers.constBegin();
414+
for ( ; layerIt != layers.constEnd(); ++layerIt )
415+
{
416+
layerList << layerIt->first;
417+
if ( layerIt->second >= 0 )
418+
mLayerNameAttribute.insert( layerIt->first->id(), layerIt->second );
419+
}
420+
421+
mMapSettings.setLayers( layerList );
403422
}
404423

405424
void QgsDxfExport::writeGroup( int code, int i )
@@ -497,22 +516,22 @@ int QgsDxfExport::writeToFile( QIODevice* d, const QString& encoding )
497516

498517
if ( mExtent.isEmpty() )
499518
{
500-
QList< QPair<QgsVectorLayer*, int> >::const_iterator layerIt = mLayers.constBegin();
501-
for ( ; layerIt != mLayers.constEnd(); ++layerIt )
519+
Q_FOREACH ( QgsMapLayer *ml, mMapSettings.layers() )
502520
{
503-
if ( layerIt->first )
504-
{
505-
QgsRectangle layerExtent = layerIt->first->extent();
506-
layerExtent = mMapSettings.layerToMapCoordinates( layerIt->first, layerExtent );
521+
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( ml );
522+
if ( !vl )
523+
continue;
507524

508-
if ( mExtent.isEmpty() )
509-
{
510-
mExtent = layerExtent;
511-
}
512-
else
513-
{
514-
mExtent.combineExtentWith( layerExtent );
515-
}
525+
QgsRectangle layerExtent = vl->extent();
526+
layerExtent = mMapSettings.layerToMapCoordinates( vl, layerExtent );
527+
528+
if ( mExtent.isEmpty() )
529+
{
530+
mExtent = layerExtent;
531+
}
532+
else
533+
{
534+
mExtent.combineExtentWith( layerExtent );
516535
}
517536
}
518537
}
@@ -747,27 +766,28 @@ void QgsDxfExport::writeTables()
747766
writeGroup( 70, 0 );
748767
writeGroup( 0, QStringLiteral( "ENDTAB" ) );
749768

750-
QList< QPair<QgsVectorLayer*, int> >::const_iterator layerIt = mLayers.constBegin();
751769
QSet<QString> layerNames;
752-
for ( ; layerIt != mLayers.constEnd(); ++layerIt )
770+
Q_FOREACH ( QgsMapLayer *ml, mMapSettings.layers() )
753771
{
754-
if ( !layerIsScaleBasedVisible( layerIt->first ) )
772+
if ( !layerIsScaleBasedVisible( ml ) )
755773
continue;
756774

757-
if ( layerIt->first )
775+
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( ml );
776+
if ( !vl )
777+
continue;
778+
779+
int attrIdx = mLayerNameAttribute.value( vl->id(), -1 );
780+
if ( attrIdx < 0 )
758781
{
759-
if ( layerIt->second < 0 )
760-
{
761-
layerNames << dxfLayerName( layerName( layerIt->first ) );
762-
}
763-
else
782+
layerNames << dxfLayerName( layerName( vl ) );
783+
}
784+
else
785+
{
786+
QList<QVariant> values;
787+
vl->uniqueValues( attrIdx, values );
788+
Q_FOREACH ( const QVariant& v, values )
764789
{
765-
QList<QVariant> values;
766-
layerIt->first->uniqueValues( layerIt->second, values );
767-
Q_FOREACH ( const QVariant& v, values )
768-
{
769-
layerNames << dxfLayerName( v.toString() );
770-
}
790+
layerNames << dxfLayerName( v.toString() );
771791
}
772792
}
773793
}
@@ -946,27 +966,40 @@ void QgsDxfExport::writeEntities()
946966
engine.setMapSettings( mMapSettings );
947967

948968
// iterate through the maplayers
949-
QList< QPair< QgsVectorLayer*, int > >::const_iterator layerIt = mLayers.constBegin();
950-
for ( ; layerIt != mLayers.constEnd(); ++layerIt )
969+
Q_FOREACH ( QgsMapLayer *ml, mMapSettings.layers() )
951970
{
952-
QgsVectorLayer* vl = layerIt->first;
971+
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
953972
if ( !vl || !layerIsScaleBasedVisible( vl ) )
954973
{
955974
continue;
956975
}
957976

977+
bool hasStyleOverride = mMapSettings.layerStyleOverrides().contains( vl->id() );
978+
if ( hasStyleOverride )
979+
{
980+
QgsDebugMsg( QString( "%1: apply override style" ).arg( vl->id() ) );
981+
vl->styleManager()->setOverrideStyle( mMapSettings.layerStyleOverrides().value( vl->id() ) );
982+
}
983+
else
984+
{
985+
QgsDebugMsg( QString( "%1: not override style" ).arg( vl->id() ) );
986+
}
987+
958988
QgsSymbolRenderContext sctx( ctx, QgsUnitTypes::RenderMillimeters, 1.0, false, 0, nullptr );
959989
QgsFeatureRenderer* renderer = vl->renderer();
960990
if ( !renderer )
961991
{
992+
if ( hasStyleOverride )
993+
vl->styleManager()->restoreOverrideStyle();
962994
continue;
963995
}
964996
renderer->startRender( ctx, vl->fields() );
965997

966998
QSet<QString> attributes = renderer->usedAttributes( ctx );
967-
if ( vl->fields().exists( layerIt->second ) )
999+
int attrIdx = mLayerNameAttribute.value( vl->id(), 1 );
1000+
if ( vl->fields().exists( attrIdx ) )
9681001
{
969-
QString layerAttr = vl->fields().at( layerIt->second ).name();
1002+
QString layerAttr = vl->fields().at( attrIdx ).name();
9701003
attributes << layerAttr;
9711004
}
9721005

@@ -1003,6 +1036,10 @@ void QgsDxfExport::writeEntities()
10031036
{
10041037
writeEntitiesSymbolLevels( vl );
10051038
renderer->stopRender( ctx );
1039+
1040+
if ( hasStyleOverride )
1041+
vl->styleManager()->restoreOverrideStyle();
1042+
10061043
continue;
10071044
}
10081045

@@ -1017,7 +1054,7 @@ void QgsDxfExport::writeEntities()
10171054
while ( featureIt.nextFeature( fet ) )
10181055
{
10191056
ctx.expressionContext().setFeature( fet );
1020-
QString lName( dxfLayerName( layerIt->second == -1 ? layerName( vl ) : fet.attribute( layerIt->second ).toString() ) );
1057+
QString lName( dxfLayerName( attrIdx < 0 ? layerName( vl ) : fet.attribute( attrIdx ).toString() ) );
10211058

10221059
sctx.setFeature( &fet );
10231060
if ( mSymbologyExport == NoSymbology )
@@ -1067,6 +1104,9 @@ void QgsDxfExport::writeEntities()
10671104
}
10681105

10691106
renderer->stopRender( ctx );
1107+
1108+
if ( hasStyleOverride )
1109+
vl->styleManager()->restoreOverrideStyle();
10701110
}
10711111

10721112
engine.run( ctx );
@@ -3936,11 +3976,9 @@ QList< QPair< QgsSymbolLayer*, QgsSymbol* > > QgsDxfExport::symbolLayers( QgsRen
39363976
{
39373977
QList< QPair< QgsSymbolLayer*, QgsSymbol* > > symbolLayers;
39383978

3939-
QList< QPair< QgsVectorLayer*, int> >::const_iterator lIt = mLayers.constBegin();
3940-
for ( ; lIt != mLayers.constEnd(); ++lIt )
3979+
Q_FOREACH ( QgsMapLayer *ml, mMapSettings.layers() )
39413980
{
3942-
// cast to vector layer
3943-
QgsVectorLayer* vl = lIt->first;
3981+
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
39443982
if ( !vl )
39453983
{
39463984
continue;
@@ -4192,12 +4230,13 @@ bool QgsDxfExport::layerIsScaleBasedVisible( const QgsMapLayer* layer ) const
41924230

41934231
QString QgsDxfExport::layerName( const QString &id, const QgsFeature &f ) const
41944232
{
4195-
QList< QPair<QgsVectorLayer*, int> >::const_iterator layerIt = mLayers.constBegin();
4196-
for ( ; layerIt != mLayers.constEnd(); ++layerIt )
4233+
Q_FOREACH ( QgsMapLayer *ml, mMapSettings.layers() )
41974234
{
4198-
if ( layerIt->first && layerIt->first->id() == id )
4235+
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( ml );
4236+
if ( vl && vl->id() == id )
41994237
{
4200-
return dxfLayerName( layerIt->second < 0 ? layerName( layerIt->first ) : f.attribute( layerIt->second ).toString() );
4238+
int attrIdx = mLayerNameAttribute.value( vl->id(), -1 );
4239+
return dxfLayerName( attrIdx < 0 ? layerName( vl ) : f.attribute( attrIdx ).toString() );
42014240
}
42024241
}
42034242

src/core/dxf/qgsdxfexport.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ class CORE_EXPORT QgsDxfExport
5555
QgsDxfExport( const QgsDxfExport &dxfExport );
5656
QgsDxfExport &operator=( const QgsDxfExport &dxfExport );
5757

58+
/**
59+
* Set map settings and assign layer name attributes
60+
* @param settings map settings to apply
61+
*/
62+
void setMapSettings( const QgsMapSettings &settings );
63+
5864
/**
5965
* Add layers to export
6066
* @param layers list of layers and corresponding attribute indexes that determine the layer name (-1 for original layer name or title)
@@ -328,8 +334,6 @@ class CORE_EXPORT QgsDxfExport
328334
void registerDxfLayer( const QString &layerId, QgsFeatureId fid, const QString &layer );
329335

330336
private:
331-
QList< QPair<QgsVectorLayer*, int> > mLayers;
332-
333337
//! Extent for export, only intersecting features are exported. If the extent is an empty rectangle, all features are exported
334338
QgsRectangle mExtent;
335339
//! Scale for symbology export (used if symbols units are mm)
@@ -396,6 +400,7 @@ class CORE_EXPORT QgsDxfExport
396400
QMap< QString, QMap<QgsFeatureId, QString> > mDxfLayerNames;
397401
QgsCoordinateReferenceSystem mCrs;
398402
QgsMapSettings mMapSettings;
403+
QHash<QString, int> mLayerNameAttribute;
399404
double mFactor;
400405
};
401406

0 commit comments

Comments
 (0)