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+
400407void 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
405424void 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
41934231QString 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
0 commit comments