From b0b9098fdc2b084177afb15e4d48da9bab75d6a9 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Fri, 7 Dec 2012 15:16:56 +0100 Subject: [PATCH 01/21] [FEATURE]: add base mechanisms for OGR feature style export --- src/core/qgsvectorfilewriter.cpp | 28 +++++++++++++++++++++++- src/core/qgsvectorfilewriter.h | 5 ++++- src/core/symbology-ng/qgssymbollayerv2.h | 2 ++ src/core/symbology-ng/qgssymbolv2.cpp | 20 +++++++++++++++++ src/core/symbology-ng/qgssymbolv2.h | 3 +++ 5 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index 515539a1400..5de1c19e832 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -24,6 +24,8 @@ #include "qgsmessagelog.h" #include "qgscoordinatereferencesystem.h" #include "qgsvectorfilewriter.h" +#include "qgsrendererv2.h" +#include "qgssymbolv2.h" #include #include @@ -430,7 +432,7 @@ QString QgsVectorFileWriter::errorMessage() return mErrorMessage; } -bool QgsVectorFileWriter::addFeature( QgsFeature& feature ) +bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2* renderer ) { // create the feature OGRFeatureH poFeature = OGR_F_Create( OGR_L_GetLayerDefn( mLayer ) ); @@ -564,6 +566,30 @@ bool QgsVectorFileWriter::addFeature( QgsFeature& feature ) } } + //add OGR feature style type + if ( mExportFeatureStyle && renderer ) + { + //concatenate ogr styles of all symbols + QgsSymbolV2List symbols = renderer->symbolsForFeature( feature ); + QString styleString; + QString currentStyle; + + QgsSymbolV2List::const_iterator symbolIt = symbols.constBegin(); + for ( ; symbolIt != symbols.constEnd(); ++symbolIt ) + { + currentStyle = ( *symbolIt )->ogrFeatureStyle(); + if ( currentStyle.isEmpty() ) + { + continue; + } + if ( symbolIt != symbols.constBegin() ) + { + styleString.append( ";" ); + } + styleString.append( currentStyle ); + } + } + // put the created feature to layer if ( OGR_L_CreateFeature( mLayer, poFeature ) != OGRERR_NONE ) { diff --git a/src/core/qgsvectorfilewriter.h b/src/core/qgsvectorfilewriter.h index 5b6fdd659f0..40837ec8057 100644 --- a/src/core/qgsvectorfilewriter.h +++ b/src/core/qgsvectorfilewriter.h @@ -132,7 +132,7 @@ class CORE_EXPORT QgsVectorFileWriter QString errorMessage(); /** add feature to the currently opened shapefile */ - bool addFeature( QgsFeature& feature ); + bool addFeature( QgsFeature& feature, QgsFeatureRendererV2* renderer = 0 ); //! @note not available in python bindings QMap attrIdxToOgrIdx() { return mAttrIdxToOgrIdx; } @@ -168,6 +168,9 @@ class CORE_EXPORT QgsVectorFileWriter /** map attribute indizes to OGR field indexes */ QMap mAttrIdxToOgrIdx; + /** flag if OGR feature type style should be exported*/ + bool mExportFeatureStyle; + private: static bool driverMetadata( QString driverName, QString &longName, QString &trLongName, QString &glob, QString &ext ); }; diff --git a/src/core/symbology-ng/qgssymbollayerv2.h b/src/core/symbology-ng/qgssymbollayerv2.h index a5b8d00c014..13c7961cd1d 100644 --- a/src/core/symbology-ng/qgssymbollayerv2.h +++ b/src/core/symbology-ng/qgssymbollayerv2.h @@ -54,6 +54,8 @@ class CORE_EXPORT QgsSymbolLayerV2 virtual void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const { Q_UNUSED( props ); element.appendChild( doc.createComment( QString( "SymbolLayerV2 %1 not implemented yet" ).arg( layerType() ) ) ); } + virtual QString ogrFeatureStyle() const { return QString(); } + virtual QgsStringMap properties() const = 0; virtual void drawPreviewIcon( QgsSymbolV2RenderContext& context, QSize size ) = 0; diff --git a/src/core/symbology-ng/qgssymbolv2.cpp b/src/core/symbology-ng/qgssymbolv2.cpp index ab7351ea510..7b6c079131d 100644 --- a/src/core/symbology-ng/qgssymbolv2.cpp +++ b/src/core/symbology-ng/qgssymbolv2.cpp @@ -314,6 +314,26 @@ void QgsSymbolV2::toSld( QDomDocument &doc, QDomElement &element, QgsStringMap p } } +QString QgsSymbolV2::ogrFeatureStyle() const +{ + QString styleString; + QString currentStyleString; + for ( QgsSymbolLayerV2List::const_iterator it = mLayers.constBegin(); it != mLayers.constEnd(); ++it ) + { + currentStyleString = ( *it )->ogrFeatureStyle(); + if ( currentStyleString.isEmpty() ) + { + continue; + } + + if ( it != mLayers.constBegin() ) + { + styleString.append( ";" ); + } + styleString.append( currentStyleString ); + } +} + QgsSymbolLayerV2List QgsSymbolV2::cloneLayers() const { QgsSymbolLayerV2List lst; diff --git a/src/core/symbology-ng/qgssymbolv2.h b/src/core/symbology-ng/qgssymbolv2.h index 0f3b07bc63d..a0eb6712bb0 100644 --- a/src/core/symbology-ng/qgssymbolv2.h +++ b/src/core/symbology-ng/qgssymbolv2.h @@ -113,6 +113,9 @@ class CORE_EXPORT QgsSymbolV2 void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const; + /**Returns the OGR feature style string for the symbol*/ + QString ogrFeatureStyle() const; + OutputUnit outputUnit() const { return mOutputUnit; } void setOutputUnit( OutputUnit u ) { mOutputUnit = u; } From ac2e77c144b5f7d6356994a14e436aa0e4e075d5 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Fri, 7 Dec 2012 16:58:06 +0100 Subject: [PATCH 02/21] Implement ogr style in simple line symbol layer --- src/core/qgsvectorfilewriter.cpp | 5 ++++- src/core/symbology-ng/qgslinesymbollayerv2.cpp | 16 ++++++++++++++++ src/core/symbology-ng/qgslinesymbollayerv2.h | 2 ++ src/core/symbology-ng/qgssymbolv2.cpp | 1 + 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index 5de1c19e832..6c19dc4a871 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -69,6 +69,7 @@ QgsVectorFileWriter::QgsVectorFileWriter( , mLayer( NULL ) , mGeom( NULL ) , mError( NoError ) + , mExportFeatureStyle( true ) { QString vectorFileName = theVectorFileName; QString fileEncoding = theFileEncoding; @@ -588,6 +589,8 @@ bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2* } styleString.append( currentStyle ); } + + OGR_F_SetStyleString( poFeature, styleString.toLocal8Bit().data() ); } // put the created feature to layer @@ -747,7 +750,7 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, { fet.clearAttributeMap(); } - if ( !writer->addFeature( fet ) ) + if ( !writer->addFeature( fet, layer->rendererV2() ) ) { WriterError err = writer->hasError(); if ( err != NoError && errorMessage ) diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp index 27d93ccf373..f4acafc0cc9 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp @@ -195,6 +195,22 @@ void QgsSimpleLineSymbolLayerV2::toSld( QDomDocument &doc, QDomElement &element, } } +QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle() const +{ + QString symbolStyle; + + //pen + symbolStyle.append( "PEN(" ); + symbolStyle.append( "c:" ); + symbolStyle.append( mPen.color().name() ); + symbolStyle.append( ",w:" ); + symbolStyle.append( QString::number( mPen.width() ) ); + symbolStyle.append( "mm" ); + symbolStyle.append( ")" ); + + return symbolStyle; +} + QgsSymbolLayerV2* QgsSimpleLineSymbolLayerV2::createFromSld( QDomElement &element ) { QgsDebugMsg( "Entered." ); diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.h b/src/core/symbology-ng/qgslinesymbollayerv2.h index 47b340ef6a1..d6c8767847a 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.h +++ b/src/core/symbology-ng/qgslinesymbollayerv2.h @@ -56,6 +56,8 @@ class CORE_EXPORT QgsSimpleLineSymbolLayerV2 : public QgsLineSymbolLayerV2 void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const; + QString ogrFeatureStyle() const; + // new stuff Qt::PenStyle penStyle() const { return mPenStyle; } diff --git a/src/core/symbology-ng/qgssymbolv2.cpp b/src/core/symbology-ng/qgssymbolv2.cpp index 7b6c079131d..0b0cc2cfc9c 100644 --- a/src/core/symbology-ng/qgssymbolv2.cpp +++ b/src/core/symbology-ng/qgssymbolv2.cpp @@ -332,6 +332,7 @@ QString QgsSymbolV2::ogrFeatureStyle() const } styleString.append( currentStyleString ); } + return styleString; } QgsSymbolLayerV2List QgsSymbolV2::cloneLayers() const From c5010dfe8c6798a61a4722dc63b933d07d945cc6 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Thu, 13 Dec 2012 17:05:32 +0100 Subject: [PATCH 03/21] Add enum to vector file writer describing the type of symbology export --- src/core/qgsvectorfilewriter.cpp | 13 ++++++++----- src/core/qgsvectorfilewriter.h | 20 ++++++++++++++++---- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index 6c19dc4a871..dd74f4d642b 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -63,13 +63,14 @@ QgsVectorFileWriter::QgsVectorFileWriter( const QString& driverName, const QStringList &datasourceOptions, const QStringList &layerOptions, - QString *newFilename + QString *newFilename, + SymbologyExport symbologyExport ) : mDS( NULL ) , mLayer( NULL ) , mGeom( NULL ) , mError( NoError ) - , mExportFeatureStyle( true ) + , mSymbologyExport( symbologyExport ) { QString vectorFileName = theVectorFileName; QString fileEncoding = theFileEncoding; @@ -568,7 +569,7 @@ bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2* } //add OGR feature style type - if ( mExportFeatureStyle && renderer ) + if ( mSymbologyExport != NoSymbology && renderer ) { //concatenate ogr styles of all symbols QgsSymbolV2List symbols = renderer->symbolsForFeature( feature ); @@ -650,7 +651,8 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, const QStringList &datasourceOptions, const QStringList &layerOptions, bool skipAttributeCreation, - QString *newFilename ) + QString *newFilename, + SymbologyExport symbologyExport ) { QgsDebugMsg( "fileName = " + fileName ); const QgsCoordinateReferenceSystem* outputCRS; @@ -674,7 +676,8 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, outputCRS = &layer->crs(); } QgsVectorFileWriter* writer = - new QgsVectorFileWriter( fileName, fileEncoding, skipAttributeCreation ? QgsFieldMap() : layer->pendingFields(), layer->wkbType(), outputCRS, driverName, datasourceOptions, layerOptions, newFilename ); + new QgsVectorFileWriter( fileName, fileEncoding, skipAttributeCreation ? QgsFieldMap() : layer->pendingFields(), layer->wkbType(), + outputCRS, driverName, datasourceOptions, layerOptions, newFilename, symbologyExport ); if ( newFilename ) { diff --git a/src/core/qgsvectorfilewriter.h b/src/core/qgsvectorfilewriter.h index 40837ec8057..86a42494c2b 100644 --- a/src/core/qgsvectorfilewriter.h +++ b/src/core/qgsvectorfilewriter.h @@ -56,6 +56,14 @@ class CORE_EXPORT QgsVectorFileWriter ErrInvalidLayer, // added in 2.0 }; + //added in 2.0 + enum SymbologyExport + { + NoSymbology = 0, //export only data + FeatureSymbology, //Keeps the number of features and export symbology per feature + SymbolLayerSymbology //Exports one feature per symbol layer (considering symbol levels) + }; + /** Write contents of vector layer to a shapefile @deprecated Use writeAsVectorFormat instead*/ Q_DECL_DEPRECATED static WriterError writeAsShapefile( QgsVectorLayer* layer, @@ -93,7 +101,8 @@ class CORE_EXPORT QgsVectorFileWriter const QStringList &datasourceOptions = QStringList(), // added in 1.6 const QStringList &layerOptions = QStringList(), // added in 1.6 bool skipAttributeCreation = false, // added in 1.6 - QString *newFilename = 0 // added in 1.9 + QString *newFilename = 0, // added in 1.9 + SymbologyExport symbologyExport = NoSymbology //added in 2.0 ); /** create shapefile and initialize it */ @@ -105,7 +114,8 @@ class CORE_EXPORT QgsVectorFileWriter const QString& driverName = "ESRI Shapefile", const QStringList &datasourceOptions = QStringList(), // added in 1.6 const QStringList &layerOptions = QStringList(), // added in 1.6 - QString *newFilename = 0 // added in 1.9 + QString *newFilename = 0, // added in 1.9 + SymbologyExport symbologyExport = NoSymbology//added in 2.0 ); /**Returns map with format filter string as key and OGR format key as value*/ @@ -146,6 +156,9 @@ class CORE_EXPORT QgsVectorFileWriter */ static bool deleteShapeFile( QString theFileName ); + SymbologyExport symbologyExport() const { return mSymbologyExport; } + void setSymbologyExport( SymbologyExport symExport ) { mSymbologyExport = symExport; } + protected: //! @note not available in python bindings OGRGeometryH createEmptyGeometry( QGis::WkbType wkbType ); @@ -168,8 +181,7 @@ class CORE_EXPORT QgsVectorFileWriter /** map attribute indizes to OGR field indexes */ QMap mAttrIdxToOgrIdx; - /** flag if OGR feature type style should be exported*/ - bool mExportFeatureStyle; + SymbologyExport mSymbologyExport; private: static bool driverMetadata( QString driverName, QString &longName, QString &trLongName, QString &glob, QString &ext ); From ce0b0b9bdf8bc3c598d7687d2c3f64e84f704318 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Mon, 17 Dec 2012 09:32:04 +0100 Subject: [PATCH 04/21] Possibility of choosing symbology export method in export dialog --- src/app/ogr/qgsvectorlayersaveasdialog.cpp | 10 ++ src/app/ogr/qgsvectorlayersaveasdialog.h | 5 + src/app/qgisapp.cpp | 3 +- src/core/qgsvectorfilewriter.cpp | 110 ++++++++++++--- src/core/qgsvectorfilewriter.h | 6 + src/ui/qgsvectorlayersaveasdialogbase.ui | 148 +++++++++++---------- 6 files changed, 192 insertions(+), 90 deletions(-) diff --git a/src/app/ogr/qgsvectorlayersaveasdialog.cpp b/src/app/ogr/qgsvectorlayersaveasdialog.cpp index 8d2b48e928d..313e53e96bd 100644 --- a/src/app/ogr/qgsvectorlayersaveasdialog.cpp +++ b/src/app/ogr/qgsvectorlayersaveasdialog.cpp @@ -62,6 +62,11 @@ QgsVectorLayerSaveAsDialog::QgsVectorLayerSaveAsDialog( long srsid, QWidget* par mEncodingComboBox->setCurrentIndex( idx ); on_mFormatComboBox_currentIndexChanged( mFormatComboBox->currentIndex() ); + + //symbology export combo box + mSymbologyExportComboBox->addItem( tr( "No symbology" ), QgsVectorFileWriter::NoSymbology ); + mSymbologyExportComboBox->addItem( tr( "Feature symbology" ), QgsVectorFileWriter::FeatureSymbology ); + mSymbologyExportComboBox->addItem( tr( "Symbol layer symbology" ), QgsVectorFileWriter::SymbolLayerSymbology ); } QgsVectorLayerSaveAsDialog::~QgsVectorLayerSaveAsDialog() @@ -190,3 +195,8 @@ bool QgsVectorLayerSaveAsDialog::addToCanvas() const { return mAddToCanvas->isChecked(); } + +int QgsVectorLayerSaveAsDialog::symbologyExport() const +{ + return mSymbologyExportComboBox->itemData( mSymbologyExportComboBox->currentIndex() ).toInt(); +} diff --git a/src/app/ogr/qgsvectorlayersaveasdialog.h b/src/app/ogr/qgsvectorlayersaveasdialog.h index 9323889b0a5..a0f6457b6b5 100644 --- a/src/app/ogr/qgsvectorlayersaveasdialog.h +++ b/src/app/ogr/qgsvectorlayersaveasdialog.h @@ -41,6 +41,11 @@ class QgsVectorLayerSaveAsDialog : public QDialog, private Ui::QgsVectorLayerSav long crs() const; bool skipAttributeCreation() const; bool addToCanvas() const; + /**Returns type of symbology export. + 0: No symbology + 1: Feature symbology + 2: Symbol level symbology*/ + int symbologyExport() const; private slots: void on_mFormatComboBox_currentIndexChanged( int idx ); diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 62d79dacbae..5b44e4a1013 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -4204,7 +4204,8 @@ void QgisApp::saveAsVectorFileGeneral( bool saveOnlySelection ) &errorMessage, datasourceOptions, dialog->layerOptions(), dialog->skipAttributeCreation(), - &newFilename ); + &newFilename, + ( QgsVectorFileWriter::SymbologyExport )( dialog->symbologyExport() ) ); QApplication::restoreOverrideCursor(); diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index dd74f4d642b..950090d5892 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -26,6 +26,7 @@ #include "qgsvectorfilewriter.h" #include "qgsrendererv2.h" #include "qgssymbolv2.h" +#include "qgssymbollayerv2.h" #include #include @@ -571,7 +572,7 @@ bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2* //add OGR feature style type if ( mSymbologyExport != NoSymbology && renderer ) { - //concatenate ogr styles of all symbols + //SymbolLayerSymbology: concatenate ogr styles of all symbollayers QgsSymbolV2List symbols = renderer->symbolsForFeature( feature ); QString styleString; QString currentStyle; @@ -579,35 +580,59 @@ bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2* QgsSymbolV2List::const_iterator symbolIt = symbols.constBegin(); for ( ; symbolIt != symbols.constEnd(); ++symbolIt ) { - currentStyle = ( *symbolIt )->ogrFeatureStyle(); - if ( currentStyle.isEmpty() ) + int nSymbolLayers = ( *symbolIt )->symbolLayerCount(); + for ( int i = 0; i < nSymbolLayers; ++i ) { - continue; - } - if ( symbolIt != symbols.constBegin() ) - { - styleString.append( ";" ); - } - styleString.append( currentStyle ); - } + /*QMap< QgsSymbolLayerV2*, QString >::const_iterator it = mSymbolLayerTable.find( (*symbolIt)->symbolLayer( i ) ); + if( it == mSymbolLayerTable.constEnd() ) + { + continue; + }*/ + currentStyle = ( *symbolIt )->symbolLayer( i )->ogrFeatureStyle();//"@" + it.value(); + if ( mSymbologyExport == FeatureSymbology ) + { + if ( symbolIt != symbols.constBegin() || i != 0 ) + { + styleString.append( ";" ); + } + styleString.append( currentStyle ); + } + else if ( mSymbologyExport == SymbolLayerSymbology ) + { + OGR_F_SetStyleString( poFeature, currentStyle.toLocal8Bit().data() ); + if ( !createFeature( mLayer, poFeature ) ) + { + return false; + } + } + } + } OGR_F_SetStyleString( poFeature, styleString.toLocal8Bit().data() ); } - // put the created feature to layer - if ( OGR_L_CreateFeature( mLayer, poFeature ) != OGRERR_NONE ) + if ( mSymbologyExport == NoSymbology || mSymbologyExport == FeatureSymbology ) { - mErrorMessage = QObject::tr( "Feature creation error (OGR error: %1)" ).arg( QString::fromUtf8( CPLGetLastErrorMsg() ) ); - mError = ErrFeatureWriteFailed; - - QgsMessageLog::logMessage( mErrorMessage, QObject::tr( "OGR" ) ); - - OGR_F_Destroy( poFeature ); - return false; + if ( !createFeature( mLayer, poFeature ) ) + { + return false; + } } OGR_F_Destroy( poFeature ); + return true; +} +bool QgsVectorFileWriter::createFeature( OGRLayerH layer, OGRFeatureH feature ) +{ + if ( OGR_L_CreateFeature( layer, feature ) != OGRERR_NONE ) + { + mErrorMessage = QObject::tr( "Feature creation error (OGR error: %1)" ).arg( QString::fromUtf8( CPLGetLastErrorMsg() ) ); + mError = ErrFeatureWriteFailed; + QgsMessageLog::logMessage( mErrorMessage, QObject::tr( "OGR" ) ); + OGR_F_Destroy( feature ); + return false; + } return true; } @@ -718,6 +743,12 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, shallTransform = false; } + //create symbol table if neede + /*if( writer->symbologyExport() != NoSymbology ) + { + writer->createSymbolLayerTable( layer, writer->mDS ); + }*/ + int n = 0, errors = 0; // write all features @@ -1114,3 +1145,42 @@ bool QgsVectorFileWriter::driverMetadata( QString driverName, QString &longName, return true; } + +void QgsVectorFileWriter::createSymbolLayerTable( QgsVectorLayer* vl, OGRDataSourceH ds ) +{ + if ( !vl || !ds ) + { + return; + } + + if ( !vl->isUsingRendererV2() ) + { + return; + } + + QgsFeatureRendererV2* renderer = vl->rendererV2(); + if ( !renderer ) + { + return; + } + + mSymbolLayerTable.clear(); + OGRStyleTableH ogrStyleTable = OGR_STBL_Create(); + OGRStyleMgrH styleManager = OGR_SM_Create( ogrStyleTable ); + + //get symbols + int nTotalLevels = 0; + QgsSymbolV2List symbolList = renderer->symbols(); + QgsSymbolV2List::iterator symbolIt = symbolList.begin(); + for ( ; symbolIt != symbolList.end(); ++symbolIt ) + { + int nLevels = ( *symbolIt )->symbolLayerCount(); + for ( int i = 0; i < nLevels; ++i ) + { + mSymbolLayerTable.insert(( *symbolIt )->symbolLayer( i ), QString::number( nTotalLevels ) ); + OGR_SM_AddStyle( styleManager, QString::number( nTotalLevels ).toLocal8Bit(), ( *symbolIt )->ogrFeatureStyle().toLocal8Bit() ); + ++nTotalLevels; + } + } + OGR_DS_SetStyleTableDirectly( ds, ogrStyleTable ); +} diff --git a/src/core/qgsvectorfilewriter.h b/src/core/qgsvectorfilewriter.h index 86a42494c2b..b38ae86f04a 100644 --- a/src/core/qgsvectorfilewriter.h +++ b/src/core/qgsvectorfilewriter.h @@ -27,7 +27,9 @@ typedef void *OGRDataSourceH; typedef void *OGRLayerH; typedef void *OGRGeometryH; +typedef void *OGRFeatureH; +class QgsSymbolLayerV2; class QTextCodec; /** \ingroup core @@ -183,8 +185,12 @@ class CORE_EXPORT QgsVectorFileWriter SymbologyExport mSymbologyExport; + QMap< QgsSymbolLayerV2*, QString > mSymbolLayerTable; + private: static bool driverMetadata( QString driverName, QString &longName, QString &trLongName, QString &glob, QString &ext ); + void createSymbolLayerTable( QgsVectorLayer* vl, OGRDataSourceH ds ); + bool createFeature( OGRLayerH layer, OGRFeatureH feature ); }; #endif diff --git a/src/ui/qgsvectorlayersaveasdialogbase.ui b/src/ui/qgsvectorlayersaveasdialogbase.ui index dcdd00de337..94f59114e87 100644 --- a/src/ui/qgsvectorlayersaveasdialogbase.ui +++ b/src/ui/qgsvectorlayersaveasdialogbase.ui @@ -14,72 +14,8 @@ Save vector layer as... - - - - false - - - - - - - false - - - true - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok - - - - - - - Save as - - - leFilename - - - - - - - false - - - Browse - - - - - - - Browse - - - - - - - - - - Encoding - - - mEncodingComboBox - - + + @@ -91,10 +27,17 @@ - - + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok + + - + OGR creation options @@ -149,6 +92,56 @@ + + + + false + + + true + + + + + + + + + + Browse + + + + + + + false + + + Browse + + + + + + + Save as + + + leFilename + + + + + + + Encoding + + + mEncodingComboBox + + + @@ -159,6 +152,23 @@ + + + + false + + + + + + + + + + Symbology export + + + From 9120e02fd8ef71dc8ed76830692e1aab449e7e28 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Mon, 17 Dec 2012 09:39:56 +0100 Subject: [PATCH 05/21] Fix width of simple line style --- src/core/symbology-ng/qgslinesymbollayerv2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp index f4acafc0cc9..d74519af9a6 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp @@ -204,7 +204,7 @@ QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle() const symbolStyle.append( "c:" ); symbolStyle.append( mPen.color().name() ); symbolStyle.append( ",w:" ); - symbolStyle.append( QString::number( mPen.width() ) ); + symbolStyle.append( QString::number( mWidth ) ); symbolStyle.append( "mm" ); symbolStyle.append( ")" ); From 64e02c81f8780a9eb998a2fa99d55bdbbba520d0 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Tue, 18 Dec 2012 11:35:40 +0100 Subject: [PATCH 06/21] Better error handling --- src/core/qgsvectorfilewriter.cpp | 230 +++++++++++++++++++++++-------- src/core/qgsvectorfilewriter.h | 6 +- 2 files changed, 180 insertions(+), 56 deletions(-) diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index 950090d5892..e8e55f0ef15 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -438,6 +438,64 @@ QString QgsVectorFileWriter::errorMessage() bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2* renderer ) { // create the feature + OGRFeatureH poFeature = createFeature( feature ); + + //add OGR feature style type + if ( mSymbologyExport != NoSymbology && renderer ) + { + //SymbolLayerSymbology: concatenate ogr styles of all symbollayers + QgsSymbolV2List symbols = renderer->symbolsForFeature( feature ); + QString styleString; + QString currentStyle; + + QgsSymbolV2List::const_iterator symbolIt = symbols.constBegin(); + for ( ; symbolIt != symbols.constEnd(); ++symbolIt ) + { + int nSymbolLayers = ( *symbolIt )->symbolLayerCount(); + for ( int i = 0; i < nSymbolLayers; ++i ) + { + /*QMap< QgsSymbolLayerV2*, QString >::const_iterator it = mSymbolLayerTable.find( (*symbolIt)->symbolLayer( i ) ); + if( it == mSymbolLayerTable.constEnd() ) + { + continue; + }*/ + currentStyle = ( *symbolIt )->symbolLayer( i )->ogrFeatureStyle();//"@" + it.value(); + + if ( mSymbologyExport == FeatureSymbology ) + { + if ( symbolIt != symbols.constBegin() || i != 0 ) + { + styleString.append( ";" ); + } + styleString.append( currentStyle ); + } + else if ( mSymbologyExport == SymbolLayerSymbology ) + { + OGR_F_SetStyleString( poFeature, currentStyle.toLocal8Bit().data() ); + if ( !writeFeature( mLayer, poFeature ) ) + { + return false; + } + } + } + } + OGR_F_SetStyleString( poFeature, styleString.toLocal8Bit().data() ); + } + + if ( mSymbologyExport == NoSymbology || mSymbologyExport == FeatureSymbology ) + { + if ( !writeFeature( mLayer, poFeature ) ) + { + return false; + } + } + + OGR_F_Destroy( poFeature ); + return true; +} + +OGRFeatureH QgsVectorFileWriter::createFeature( QgsFeature& feature ) +{ OGRFeatureH poFeature = OGR_F_Create( OGR_L_GetLayerDefn( mLayer ) ); qint64 fid = FID_TO_NUMBER( feature.id() ); @@ -568,62 +626,10 @@ bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2* OGR_F_SetGeometry( poFeature, mGeom ); } } - - //add OGR feature style type - if ( mSymbologyExport != NoSymbology && renderer ) - { - //SymbolLayerSymbology: concatenate ogr styles of all symbollayers - QgsSymbolV2List symbols = renderer->symbolsForFeature( feature ); - QString styleString; - QString currentStyle; - - QgsSymbolV2List::const_iterator symbolIt = symbols.constBegin(); - for ( ; symbolIt != symbols.constEnd(); ++symbolIt ) - { - int nSymbolLayers = ( *symbolIt )->symbolLayerCount(); - for ( int i = 0; i < nSymbolLayers; ++i ) - { - /*QMap< QgsSymbolLayerV2*, QString >::const_iterator it = mSymbolLayerTable.find( (*symbolIt)->symbolLayer( i ) ); - if( it == mSymbolLayerTable.constEnd() ) - { - continue; - }*/ - currentStyle = ( *symbolIt )->symbolLayer( i )->ogrFeatureStyle();//"@" + it.value(); - - if ( mSymbologyExport == FeatureSymbology ) - { - if ( symbolIt != symbols.constBegin() || i != 0 ) - { - styleString.append( ";" ); - } - styleString.append( currentStyle ); - } - else if ( mSymbologyExport == SymbolLayerSymbology ) - { - OGR_F_SetStyleString( poFeature, currentStyle.toLocal8Bit().data() ); - if ( !createFeature( mLayer, poFeature ) ) - { - return false; - } - } - } - } - OGR_F_SetStyleString( poFeature, styleString.toLocal8Bit().data() ); - } - - if ( mSymbologyExport == NoSymbology || mSymbologyExport == FeatureSymbology ) - { - if ( !createFeature( mLayer, poFeature ) ) - { - return false; - } - } - - OGR_F_Destroy( poFeature ); - return true; + return poFeature; } -bool QgsVectorFileWriter::createFeature( OGRLayerH layer, OGRFeatureH feature ) +bool QgsVectorFileWriter::writeFeature( OGRLayerH layer, OGRFeatureH feature ) { if ( OGR_L_CreateFeature( layer, feature ) != OGRERR_NONE ) { @@ -743,12 +749,24 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, shallTransform = false; } - //create symbol table if neede + //create symbol table if needed /*if( writer->symbologyExport() != NoSymbology ) { writer->createSymbolLayerTable( layer, writer->mDS ); }*/ + if ( writer->symbologyExport() == SymbolLayerSymbology && layer->isUsingRendererV2() ) + { + QgsFeatureRendererV2* r = layer->rendererV2(); + if ( r->capabilities() & QgsFeatureRendererV2::SymbolLevels + && r->usingSymbolLevels() ) + { + QgsVectorFileWriter::WriterError error = writer->exportFeaturesSymbolLevels( layer, ct, errorMessage ); + delete writer; + return ( error == NoError ) ? NoError : ErrFeatureWriteFailed; + } + } + int n = 0, errors = 0; // write all features @@ -1184,3 +1202,105 @@ void QgsVectorFileWriter::createSymbolLayerTable( QgsVectorLayer* vl, OGRDataSo } OGR_DS_SetStyleTableDirectly( ds, ogrStyleTable ); } + +QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels( QgsVectorLayer* layer, const QgsCoordinateTransform* ct, QString* errorMessage ) +{ + if ( !layer || !layer->isUsingRendererV2() ) + { + //return error + } + QgsFeatureRendererV2* renderer = layer->rendererV2(); + if ( !renderer ) + { + //return error + } + QHash< QgsSymbolV2*, QList > features; + + //fetch features + QgsFeature fet; + QgsSymbolV2* featureSymbol = 0; + while ( layer->nextFeature( fet ) ) + { + featureSymbol = renderer->symbolForFeature( fet ); + if ( !featureSymbol ) + { + continue; + } + + QHash< QgsSymbolV2*, QList >::iterator it = features.find( featureSymbol ); + if ( it == features.end() ) + { + it = features.insert( featureSymbol, QList() ); + } + it.value().append( fet ); + } + + //find out order + QgsSymbolV2LevelOrder levels; + QgsSymbolV2List symbols = renderer->symbols(); + for ( int i = 0; i < symbols.count(); i++ ) + { + QgsSymbolV2* sym = symbols[i]; + for ( int j = 0; j < sym->symbolLayerCount(); j++ ) + { + int level = sym->symbolLayer( j )->renderingPass(); + if ( level < 0 || level >= 1000 ) // ignore invalid levels + continue; + QgsSymbolV2LevelItem item( sym, j ); + while ( level >= levels.count() ) // append new empty levels + levels.append( QgsSymbolV2Level() ); + levels[level].append( item ); + } + } + + int nErrors = 0; + int nTotalFeatures = 0; + + //export symbol layers and symbology + for ( int l = 0; l < levels.count(); l++ ) + { + QgsSymbolV2Level& level = levels[l]; + for ( int i = 0; i < level.count(); i++ ) + { + QgsSymbolV2LevelItem& item = level[i]; + QHash< QgsSymbolV2*, QList >::iterator levelIt = features.find( item.symbol() ); + if ( levelIt == features.end() ) + { + ++nErrors; + continue; + } + + int llayer = item.layer(); + QList& featureList = levelIt.value(); + QList::iterator featureIt = featureList.begin(); + for ( ; featureIt != featureList.end(); ++featureIt ) + { + ++nTotalFeatures; + OGRFeatureH ogrFeature = createFeature( *featureIt ); + if ( !ogrFeature ) + { + ++nErrors; + continue; + } + + QString styleString = levelIt.key()->symbolLayer( llayer )->ogrFeatureStyle(); + if ( !styleString.isEmpty() ) + { + OGR_F_SetStyleString( ogrFeature, styleString.toLocal8Bit().data() ); + if ( ! writeFeature( mLayer, ogrFeature ) ) + { + ++nErrors; + } + } + OGR_F_Destroy( ogrFeature ); + } + } + } + + if ( nErrors > 0 && errorMessage ) + { + *errorMessage += QObject::tr( "\nOnly %1 of %2 features written." ).arg( nTotalFeatures - nErrors ).arg( nTotalFeatures ); + } + + return ( nErrors > 0 ) ? QgsVectorFileWriter::ErrFeatureWriteFailed : QgsVectorFileWriter::NoError; +} diff --git a/src/core/qgsvectorfilewriter.h b/src/core/qgsvectorfilewriter.h index b38ae86f04a..01ba0f37ae5 100644 --- a/src/core/qgsvectorfilewriter.h +++ b/src/core/qgsvectorfilewriter.h @@ -190,7 +190,11 @@ class CORE_EXPORT QgsVectorFileWriter private: static bool driverMetadata( QString driverName, QString &longName, QString &trLongName, QString &glob, QString &ext ); void createSymbolLayerTable( QgsVectorLayer* vl, OGRDataSourceH ds ); - bool createFeature( OGRLayerH layer, OGRFeatureH feature ); + OGRFeatureH createFeature( QgsFeature& feature ); + bool writeFeature( OGRLayerH layer, OGRFeatureH feature ); + + /**Writes features considering symbol level order*/ + WriterError exportFeaturesSymbolLevels( QgsVectorLayer* layer, const QgsCoordinateTransform* ct, QString* errorMessage = 0 ); }; #endif From 3fba12f466518086aa697909dc3e309521438cc8 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Tue, 18 Dec 2012 13:12:15 +0100 Subject: [PATCH 07/21] Add coordinate transform to symbol layer vector export --- src/core/qgsvectorfilewriter.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index e8e55f0ef15..2f0f072be25 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -763,6 +763,7 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, { QgsVectorFileWriter::WriterError error = writer->exportFeaturesSymbolLevels( layer, ct, errorMessage ); delete writer; + delete ct; return ( error == NoError ) ? NoError : ErrFeatureWriteFailed; } } @@ -1221,6 +1222,29 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels QgsSymbolV2* featureSymbol = 0; while ( layer->nextFeature( fet ) ) { + if ( ct ) + { + try + { + if ( fet.geometry() ) + { + fet.geometry()->transform( *ct ); + } + } + catch ( QgsCsException &e ) + { + delete ct; + + QString msg = QObject::tr( "Failed to transform a point while drawing a feature of type '%1'. Writing stopped. (Exception: %2)" ) + .arg( fet.typeName() ).arg( e.what() ); + QgsLogger::warning( msg ); + if ( errorMessage ) + *errorMessage = msg; + + return ErrProjection; + } + } + featureSymbol = renderer->symbolForFeature( fet ); if ( !featureSymbol ) { From 307c49cce5b2d96f5c891bb452182100a201d475 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Tue, 18 Dec 2012 15:38:56 +0100 Subject: [PATCH 08/21] ogr feature style for simple marker --- .../symbology-ng/qgsmarkersymbollayerv2.cpp | 60 +++++++++++++++++++ .../symbology-ng/qgsmarkersymbollayerv2.h | 2 + 2 files changed, 62 insertions(+) diff --git a/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp b/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp index b431443f096..e94a8029b3f 100644 --- a/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp +++ b/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp @@ -480,6 +480,66 @@ void QgsSimpleMarkerSymbolLayerV2::writeSldMarker( QDomDocument &doc, QDomElemen QgsSymbolLayerV2Utils::createDisplacementElement( doc, graphicElem, mOffset ); } +QString QgsSimpleMarkerSymbolLayerV2::ogrFeatureStyle() const +{ +#if 0 + QString ogrType = "3"; //default is circle + if ( mName == "square" ) + { + ogrType = "5"; + } + else if ( mName == "triangle" ) + { + ogrType = "7"; + } + else if ( mName == "star" ) + { + ogrType = "9"; + } + else if ( mName == "circle" ) + { + ogrType = "3"; + } + else if ( mName == "cross" ) + { + ogrType = "0"; + } + else if ( mName == "x" || mName == "cross2" ) + { + ogrType = "1"; + } + else if ( mName == "line" ) + { + ogrType = "10"; + } + + QString ogrString; + ogrString.append( "SYMBOL(" ); + ogrString.append( "id:" ); + ogrString.append( "\"" ); + ogrString.append( "ogr-sym-" ); + ogrString.append( ogrType ); + ogrString.append( "\"" ); + ogrString.append( ",c:" ); + ogrString.append( mColor.name() ); + ogrString.append( ",o:" ); + ogrString.append( mBorderColor.name() ); + ogrString.append( QString( ",s:%1mm" ).arg( mSize ) ); + ogrString.append( ")" ); + return ogrString; +#endif //0 + + QString ogrString; + ogrString.append( "PEN(" ); + ogrString.append( "c:" ); + ogrString.append( mColor.name() ); + ogrString.append( ",w:" ); + ogrString.append( QString::number( mSize ) ); + ogrString.append( "mm" ); + ogrString.append( ")" ); + return ogrString; +} + QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::createFromSld( QDomElement &element ) { QgsDebugMsg( "Entered." ); diff --git a/src/core/symbology-ng/qgsmarkersymbollayerv2.h b/src/core/symbology-ng/qgsmarkersymbollayerv2.h index f5f87542495..16c0a2f0f26 100644 --- a/src/core/symbology-ng/qgsmarkersymbollayerv2.h +++ b/src/core/symbology-ng/qgsmarkersymbollayerv2.h @@ -62,6 +62,8 @@ class CORE_EXPORT QgsSimpleMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2 void writeSldMarker( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const; + QString ogrFeatureStyle() const; + QString name() const { return mName; } void setName( QString name ) { mName = name; } From 3a63b7babadf1deac5be7bf6b4e099a34f24c0d7 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Thu, 20 Dec 2012 17:18:37 +0100 Subject: [PATCH 09/21] Hack to fix line widths (for dxf only?) --- src/core/symbology-ng/qgslinesymbollayerv2.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp index d74519af9a6..7e35d2b5af4 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp @@ -204,8 +204,9 @@ QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle() const symbolStyle.append( "c:" ); symbolStyle.append( mPen.color().name() ); symbolStyle.append( ",w:" ); + //dxf driver writes ground units as mm? Should probably be changed in ogr symbolStyle.append( QString::number( mWidth ) ); - symbolStyle.append( "mm" ); + symbolStyle.append( "g" ); symbolStyle.append( ")" ); return symbolStyle; From 1a79041af2fd46bf9b321915bac56f0eb107678d Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Fri, 21 Dec 2012 16:28:34 +0100 Subject: [PATCH 10/21] Use scale for symbology export (if symbol measures are defined in map units) --- .../symbology-ng/qgssymbollayerv2utils.sip | 4 +- src/analysis/CMakeLists.txt | 1 + src/app/ogr/qgsvectorlayersaveasdialog.cpp | 5 + src/app/ogr/qgsvectorlayersaveasdialog.h | 1 + src/app/qgisapp.cpp | 3 +- src/core/qgsvectorfilewriter.cpp | 65 +++++-- src/core/qgsvectorfilewriter.h | 15 +- .../symbology-ng/qgslinesymbollayerv2.cpp | 4 +- src/core/symbology-ng/qgslinesymbollayerv2.h | 2 +- .../symbology-ng/qgsmarkersymbollayerv2.cpp | 2 +- .../symbology-ng/qgsmarkersymbollayerv2.h | 2 +- src/core/symbology-ng/qgssymbollayerv2.h | 2 +- .../symbology-ng/qgssymbollayerv2utils.cpp | 4 +- src/core/symbology-ng/qgssymbollayerv2utils.h | 4 +- src/core/symbology-ng/qgssymbolv2.cpp | 21 --- src/core/symbology-ng/qgssymbolv2.h | 3 - src/providers/ogr/CMakeLists.txt | 1 + src/ui/qgsvectorlayersaveasdialogbase.ui | 172 ++++++++++-------- 18 files changed, 184 insertions(+), 127 deletions(-) diff --git a/python/core/symbology-ng/qgssymbollayerv2utils.sip b/python/core/symbology-ng/qgssymbollayerv2utils.sip index 44e41feabd4..37646a9ada3 100644 --- a/python/core/symbology-ng/qgssymbollayerv2utils.sip +++ b/python/core/symbology-ng/qgssymbollayerv2utils.sip @@ -168,9 +168,9 @@ class QgsSymbolLayerV2Utils static QColor parseColor( QString colorStr ); /**Returns the line width scale factor depending on the unit and the paint device*/ - static double lineWidthScaleFactor( QgsRenderContext& c, QgsSymbolV2::OutputUnit u ); + static double lineWidthScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u ); /**Returns scale factor painter units -> pixel dimensions*/ - static double pixelSizeScaleFactor( QgsRenderContext& c, QgsSymbolV2::OutputUnit u ); + static double pixelSizeScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u ); /**Creates a render context for a pixel based device*/ static QgsRenderContext createRenderContext( QPainter* p ); diff --git a/src/analysis/CMakeLists.txt b/src/analysis/CMakeLists.txt index 0bec00e4f4e..ec31141dc70 100644 --- a/src/analysis/CMakeLists.txt +++ b/src/analysis/CMakeLists.txt @@ -82,6 +82,7 @@ INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/../core/ ${CMAKE_CURRENT_SOURCE_DIR}/../core/renderer ${CMAKE_CURRENT_SOURCE_DIR}/../core/raster + ${CMAKE_CURRENT_SOURCE_DIR}/../core/symbology-ng interpolation ${PROJ_INCLUDE_DIR} ${GEOS_INCLUDE_DIR} diff --git a/src/app/ogr/qgsvectorlayersaveasdialog.cpp b/src/app/ogr/qgsvectorlayersaveasdialog.cpp index 313e53e96bd..914b4774a34 100644 --- a/src/app/ogr/qgsvectorlayersaveasdialog.cpp +++ b/src/app/ogr/qgsvectorlayersaveasdialog.cpp @@ -200,3 +200,8 @@ int QgsVectorLayerSaveAsDialog::symbologyExport() const { return mSymbologyExportComboBox->itemData( mSymbologyExportComboBox->currentIndex() ).toInt(); } + +double QgsVectorLayerSaveAsDialog::scaleDenominator() const +{ + return mScaleSpinBox->value(); +} diff --git a/src/app/ogr/qgsvectorlayersaveasdialog.h b/src/app/ogr/qgsvectorlayersaveasdialog.h index a0f6457b6b5..63fe2951949 100644 --- a/src/app/ogr/qgsvectorlayersaveasdialog.h +++ b/src/app/ogr/qgsvectorlayersaveasdialog.h @@ -46,6 +46,7 @@ class QgsVectorLayerSaveAsDialog : public QDialog, private Ui::QgsVectorLayerSav 1: Feature symbology 2: Symbol level symbology*/ int symbologyExport() const; + double scaleDenominator() const; private slots: void on_mFormatComboBox_currentIndexChanged( int idx ); diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 5b44e4a1013..89f808c3ea4 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -4205,7 +4205,8 @@ void QgisApp::saveAsVectorFileGeneral( bool saveOnlySelection ) datasourceOptions, dialog->layerOptions(), dialog->skipAttributeCreation(), &newFilename, - ( QgsVectorFileWriter::SymbologyExport )( dialog->symbologyExport() ) ); + ( QgsVectorFileWriter::SymbologyExport )( dialog->symbologyExport() ), + dialog->scaleDenominator() ); QApplication::restoreOverrideCursor(); diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index 2f0f072be25..866d71ad187 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -25,7 +25,6 @@ #include "qgscoordinatereferencesystem.h" #include "qgsvectorfilewriter.h" #include "qgsrendererv2.h" -#include "qgssymbolv2.h" #include "qgssymbollayerv2.h" #include @@ -435,7 +434,7 @@ QString QgsVectorFileWriter::errorMessage() return mErrorMessage; } -bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2* renderer ) +bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2* renderer, QGis::UnitType outputUnit ) { // create the feature OGRFeatureH poFeature = createFeature( feature ); @@ -459,7 +458,8 @@ bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2* { continue; }*/ - currentStyle = ( *symbolIt )->symbolLayer( i )->ogrFeatureStyle();//"@" + it.value(); + double wScaleFactor = widthScaleFactor( mSymbologyScaleDenominator, ( *symbolIt )->outputUnit(), outputUnit ); + currentStyle = ( *symbolIt )->symbolLayer( i )->ogrFeatureStyle( wScaleFactor );//"@" + it.value(); if ( mSymbologyExport == FeatureSymbology ) { @@ -683,7 +683,8 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, const QStringList &layerOptions, bool skipAttributeCreation, QString *newFilename, - SymbologyExport symbologyExport ) + SymbologyExport symbologyExport, + double symbologyScale ) { QgsDebugMsg( "fileName = " + fileName ); const QgsCoordinateReferenceSystem* outputCRS; @@ -709,6 +710,7 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, QgsVectorFileWriter* writer = new QgsVectorFileWriter( fileName, fileEncoding, skipAttributeCreation ? QgsFieldMap() : layer->pendingFields(), layer->wkbType(), outputCRS, driverName, datasourceOptions, layerOptions, newFilename, symbologyExport ); + writer->setSymbologyScaleDenominator( symbologyScale ); if ( newFilename ) { @@ -750,10 +752,10 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, } //create symbol table if needed - /*if( writer->symbologyExport() != NoSymbology ) + if ( writer->symbologyExport() != NoSymbology ) { - writer->createSymbolLayerTable( layer, writer->mDS ); - }*/ + //writer->createSymbolLayerTable( layer, writer->mDS ); + } if ( writer->symbologyExport() == SymbolLayerSymbology && layer->isUsingRendererV2() ) { @@ -770,6 +772,13 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, int n = 0, errors = 0; + //unit type + QGis::UnitType mapUnits = layer->crs().mapUnits(); + if ( ct ) + { + mapUnits = ct->destCRS().mapUnits(); + } + // write all features while ( layer->nextFeature( fet ) ) { @@ -803,7 +812,7 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, { fet.clearAttributeMap(); } - if ( !writer->addFeature( fet, layer->rendererV2() ) ) + if ( !writer->addFeature( fet, layer->rendererV2(), mapUnits ) ) { WriterError err = writer->hasError(); if ( err != NoError && errorMessage ) @@ -1165,7 +1174,7 @@ bool QgsVectorFileWriter::driverMetadata( QString driverName, QString &longName, return true; } -void QgsVectorFileWriter::createSymbolLayerTable( QgsVectorLayer* vl, OGRDataSourceH ds ) +void QgsVectorFileWriter::createSymbolLayerTable( QgsVectorLayer* vl, const QgsCoordinateTransform* ct, OGRDataSourceH ds ) { if ( !vl || !ds ) { @@ -1183,6 +1192,13 @@ void QgsVectorFileWriter::createSymbolLayerTable( QgsVectorLayer* vl, OGRDataSo return; } + //unit type + QGis::UnitType mapUnits = vl->crs().mapUnits(); + if ( ct ) + { + mapUnits = ct->destCRS().mapUnits(); + } + mSymbolLayerTable.clear(); OGRStyleTableH ogrStyleTable = OGR_STBL_Create(); OGRStyleMgrH styleManager = OGR_SM_Create( ogrStyleTable ); @@ -1197,7 +1213,8 @@ void QgsVectorFileWriter::createSymbolLayerTable( QgsVectorLayer* vl, OGRDataSo for ( int i = 0; i < nLevels; ++i ) { mSymbolLayerTable.insert(( *symbolIt )->symbolLayer( i ), QString::number( nTotalLevels ) ); - OGR_SM_AddStyle( styleManager, QString::number( nTotalLevels ).toLocal8Bit(), ( *symbolIt )->ogrFeatureStyle().toLocal8Bit() ); + OGR_SM_AddStyle( styleManager, QString::number( nTotalLevels ).toLocal8Bit(), + ( *symbolIt )->symbolLayer( i )->ogrFeatureStyle( widthScaleFactor( mSymbologyScaleDenominator, ( *symbolIt )->outputUnit(), mapUnits ) ).toLocal8Bit() ); ++nTotalLevels; } } @@ -1217,6 +1234,13 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels } QHash< QgsSymbolV2*, QList > features; + //unit type + QGis::UnitType mapUnits = layer->crs().mapUnits(); + if ( ct ) + { + mapUnits = ct->destCRS().mapUnits(); + } + //fetch features QgsFeature fet; QgsSymbolV2* featureSymbol = 0; @@ -1307,7 +1331,8 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels continue; } - QString styleString = levelIt.key()->symbolLayer( llayer )->ogrFeatureStyle(); + QString styleString = levelIt.key()->symbolLayer( llayer )->ogrFeatureStyle( widthScaleFactor( mSymbologyScaleDenominator, levelIt.key()->outputUnit(), + mapUnits ) ); if ( !styleString.isEmpty() ) { OGR_F_SetStyleString( ogrFeature, styleString.toLocal8Bit().data() ); @@ -1328,3 +1353,21 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels return ( nErrors > 0 ) ? QgsVectorFileWriter::ErrFeatureWriteFailed : QgsVectorFileWriter::NoError; } + +double QgsVectorFileWriter::widthScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits ) +{ + if ( symbolUnits == QgsSymbolV2::MM ) + { + return 1.0; + } + else + { + //conversion factor map units -> mm + if ( mapUnits == QGis::Meters ) + { + return 1000 / scaleDenominator; + } + + } + return 1.0; //todo: map units +} diff --git a/src/core/qgsvectorfilewriter.h b/src/core/qgsvectorfilewriter.h index 01ba0f37ae5..252e18adf92 100644 --- a/src/core/qgsvectorfilewriter.h +++ b/src/core/qgsvectorfilewriter.h @@ -21,6 +21,7 @@ #include "qgsvectorlayer.h" #include "qgsfield.h" +#include "qgssymbolv2.h" #include @@ -104,7 +105,8 @@ class CORE_EXPORT QgsVectorFileWriter const QStringList &layerOptions = QStringList(), // added in 1.6 bool skipAttributeCreation = false, // added in 1.6 QString *newFilename = 0, // added in 1.9 - SymbologyExport symbologyExport = NoSymbology //added in 2.0 + SymbologyExport symbologyExport = NoSymbology, //added in 2.0 + double symbologyScale = 1.0 // added in 2.0 ); /** create shapefile and initialize it */ @@ -144,7 +146,7 @@ class CORE_EXPORT QgsVectorFileWriter QString errorMessage(); /** add feature to the currently opened shapefile */ - bool addFeature( QgsFeature& feature, QgsFeatureRendererV2* renderer = 0 ); + bool addFeature( QgsFeature& feature, QgsFeatureRendererV2* renderer = 0, QGis::UnitType outputUnit = QGis::Meters ); //! @note not available in python bindings QMap attrIdxToOgrIdx() { return mAttrIdxToOgrIdx; } @@ -161,6 +163,9 @@ class CORE_EXPORT QgsVectorFileWriter SymbologyExport symbologyExport() const { return mSymbologyExport; } void setSymbologyExport( SymbologyExport symExport ) { mSymbologyExport = symExport; } + double symbologyScaleDenominator() const { return mSymbologyScaleDenominator; } + void setSymbologyScaleDenominator( double d ) { mSymbologyScaleDenominator = d; } + protected: //! @note not available in python bindings OGRGeometryH createEmptyGeometry( QGis::WkbType wkbType ); @@ -187,14 +192,18 @@ class CORE_EXPORT QgsVectorFileWriter QMap< QgsSymbolLayerV2*, QString > mSymbolLayerTable; + /**Scale for symbology export (e.g. for symbols units in map units)*/ + double mSymbologyScaleDenominator; + private: static bool driverMetadata( QString driverName, QString &longName, QString &trLongName, QString &glob, QString &ext ); - void createSymbolLayerTable( QgsVectorLayer* vl, OGRDataSourceH ds ); + void createSymbolLayerTable( QgsVectorLayer* vl, const QgsCoordinateTransform* ct, OGRDataSourceH ds ); OGRFeatureH createFeature( QgsFeature& feature ); bool writeFeature( OGRLayerH layer, OGRFeatureH feature ); /**Writes features considering symbol level order*/ WriterError exportFeaturesSymbolLevels( QgsVectorLayer* layer, const QgsCoordinateTransform* ct, QString* errorMessage = 0 ); + double widthScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits ); }; #endif diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp index 7e35d2b5af4..29b6411891d 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp @@ -195,7 +195,7 @@ void QgsSimpleLineSymbolLayerV2::toSld( QDomDocument &doc, QDomElement &element, } } -QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle() const +QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle( double widthScaleFactor ) const { QString symbolStyle; @@ -205,7 +205,7 @@ QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle() const symbolStyle.append( mPen.color().name() ); symbolStyle.append( ",w:" ); //dxf driver writes ground units as mm? Should probably be changed in ogr - symbolStyle.append( QString::number( mWidth ) ); + symbolStyle.append( QString::number( mWidth * widthScaleFactor ) ); symbolStyle.append( "g" ); symbolStyle.append( ")" ); diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.h b/src/core/symbology-ng/qgslinesymbollayerv2.h index d6c8767847a..9fd91b20f49 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.h +++ b/src/core/symbology-ng/qgslinesymbollayerv2.h @@ -56,7 +56,7 @@ class CORE_EXPORT QgsSimpleLineSymbolLayerV2 : public QgsLineSymbolLayerV2 void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const; - QString ogrFeatureStyle() const; + QString ogrFeatureStyle( double widthScaleFactor ) const; // new stuff diff --git a/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp b/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp index e94a8029b3f..895a51de024 100644 --- a/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp +++ b/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp @@ -480,7 +480,7 @@ void QgsSimpleMarkerSymbolLayerV2::writeSldMarker( QDomDocument &doc, QDomElemen QgsSymbolLayerV2Utils::createDisplacementElement( doc, graphicElem, mOffset ); } -QString QgsSimpleMarkerSymbolLayerV2::ogrFeatureStyle() const +QString QgsSimpleMarkerSymbolLayerV2::ogrFeatureStyle( double widthScaleFactor ) const { #if 0 QString ogrType = "3"; //default is circle diff --git a/src/core/symbology-ng/qgsmarkersymbollayerv2.h b/src/core/symbology-ng/qgsmarkersymbollayerv2.h index 16c0a2f0f26..6d3650d3a7c 100644 --- a/src/core/symbology-ng/qgsmarkersymbollayerv2.h +++ b/src/core/symbology-ng/qgsmarkersymbollayerv2.h @@ -62,7 +62,7 @@ class CORE_EXPORT QgsSimpleMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2 void writeSldMarker( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const; - QString ogrFeatureStyle() const; + QString ogrFeatureStyle( double widthScaleFactor ) const; QString name() const { return mName; } void setName( QString name ) { mName = name; } diff --git a/src/core/symbology-ng/qgssymbollayerv2.h b/src/core/symbology-ng/qgssymbollayerv2.h index 13c7961cd1d..2252ba69c7b 100644 --- a/src/core/symbology-ng/qgssymbollayerv2.h +++ b/src/core/symbology-ng/qgssymbollayerv2.h @@ -54,7 +54,7 @@ class CORE_EXPORT QgsSymbolLayerV2 virtual void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const { Q_UNUSED( props ); element.appendChild( doc.createComment( QString( "SymbolLayerV2 %1 not implemented yet" ).arg( layerType() ) ) ); } - virtual QString ogrFeatureStyle() const { return QString(); } + virtual QString ogrFeatureStyle( double widthScaleFactor ) const { Q_UNUSED( widthScaleFactor ); return QString(); } virtual QgsStringMap properties() const = 0; diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.cpp b/src/core/symbology-ng/qgssymbollayerv2utils.cpp index eee5f99e80c..82eaefe69c3 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.cpp +++ b/src/core/symbology-ng/qgssymbollayerv2utils.cpp @@ -2455,7 +2455,7 @@ QColor QgsSymbolLayerV2Utils::parseColor( QString colorStr ) return QColor( p[0].toInt(), p[1].toInt(), p[2].toInt() ); } -double QgsSymbolLayerV2Utils::lineWidthScaleFactor( QgsRenderContext& c, QgsSymbolV2::OutputUnit u ) +double QgsSymbolLayerV2Utils::lineWidthScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u ) { if ( u == QgsSymbolV2::MM ) @@ -2476,7 +2476,7 @@ double QgsSymbolLayerV2Utils::lineWidthScaleFactor( QgsRenderContext& c, QgsSymb } } -double QgsSymbolLayerV2Utils::pixelSizeScaleFactor( QgsRenderContext& c, QgsSymbolV2::OutputUnit u ) +double QgsSymbolLayerV2Utils::pixelSizeScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u ) { if ( u == QgsSymbolV2::MM ) { diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.h b/src/core/symbology-ng/qgssymbollayerv2utils.h index ade884985f1..3e2467d7060 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.h +++ b/src/core/symbology-ng/qgssymbollayerv2utils.h @@ -203,9 +203,9 @@ class CORE_EXPORT QgsSymbolLayerV2Utils static QColor parseColor( QString colorStr ); /**Returns the line width scale factor depending on the unit and the paint device*/ - static double lineWidthScaleFactor( QgsRenderContext& c, QgsSymbolV2::OutputUnit u ); + static double lineWidthScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u ); /**Returns scale factor painter units -> pixel dimensions*/ - static double pixelSizeScaleFactor( QgsRenderContext& c, QgsSymbolV2::OutputUnit u ); + static double pixelSizeScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u ); /**Creates a render context for a pixel based device*/ static QgsRenderContext createRenderContext( QPainter* p ); diff --git a/src/core/symbology-ng/qgssymbolv2.cpp b/src/core/symbology-ng/qgssymbolv2.cpp index 0b0cc2cfc9c..ab7351ea510 100644 --- a/src/core/symbology-ng/qgssymbolv2.cpp +++ b/src/core/symbology-ng/qgssymbolv2.cpp @@ -314,27 +314,6 @@ void QgsSymbolV2::toSld( QDomDocument &doc, QDomElement &element, QgsStringMap p } } -QString QgsSymbolV2::ogrFeatureStyle() const -{ - QString styleString; - QString currentStyleString; - for ( QgsSymbolLayerV2List::const_iterator it = mLayers.constBegin(); it != mLayers.constEnd(); ++it ) - { - currentStyleString = ( *it )->ogrFeatureStyle(); - if ( currentStyleString.isEmpty() ) - { - continue; - } - - if ( it != mLayers.constBegin() ) - { - styleString.append( ";" ); - } - styleString.append( currentStyleString ); - } - return styleString; -} - QgsSymbolLayerV2List QgsSymbolV2::cloneLayers() const { QgsSymbolLayerV2List lst; diff --git a/src/core/symbology-ng/qgssymbolv2.h b/src/core/symbology-ng/qgssymbolv2.h index a0eb6712bb0..0f3b07bc63d 100644 --- a/src/core/symbology-ng/qgssymbolv2.h +++ b/src/core/symbology-ng/qgssymbolv2.h @@ -113,9 +113,6 @@ class CORE_EXPORT QgsSymbolV2 void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const; - /**Returns the OGR feature style string for the symbol*/ - QString ogrFeatureStyle() const; - OutputUnit outputUnit() const { return mOutputUnit; } void setOutputUnit( OutputUnit u ) { mOutputUnit = u; } diff --git a/src/providers/ogr/CMakeLists.txt b/src/providers/ogr/CMakeLists.txt index 2c727b27ecb..de004f3c492 100644 --- a/src/providers/ogr/CMakeLists.txt +++ b/src/providers/ogr/CMakeLists.txt @@ -11,6 +11,7 @@ QT4_WRAP_CPP(OGR_MOC_SRCS ${OGR_MOC_HDRS}) INCLUDE_DIRECTORIES( . ../../core + ${CMAKE_CURRENT_SOURCE_DIR}/../../core/symbology-ng ${GDAL_INCLUDE_DIR} ${GEOS_INCLUDE_DIR} ) diff --git a/src/ui/qgsvectorlayersaveasdialogbase.ui b/src/ui/qgsvectorlayersaveasdialogbase.ui index 94f59114e87..1c29c5e3ae7 100644 --- a/src/ui/qgsvectorlayersaveasdialogbase.ui +++ b/src/ui/qgsvectorlayersaveasdialogbase.ui @@ -14,8 +14,85 @@ Save vector layer as... - - + + + + false + + + + + + + Browse + + + + + + + Encoding + + + mEncodingComboBox + + + + + + + CRS + + + leCRS + + + + + + + + + + Symbology export + + + + + + + Save as + + + leFilename + + + + + + + + + + false + + + Browse + + + + + + + false + + + true + + + + + @@ -27,7 +104,7 @@ - + Qt::Horizontal @@ -37,7 +114,10 @@ - + + + + OGR creation options @@ -89,83 +169,23 @@ - - - - - - - false + + + + 1: - - true + + 999999999 + + + 50000 - - - - - + + - Browse - - - - - - - false - - - Browse - - - - - - - Save as - - - leFilename - - - - - - - Encoding - - - mEncodingComboBox - - - - - - - CRS - - - leCRS - - - - - - - false - - - - - - - - - - Symbology export + Scale From fa5cb77eb70aa443e22105dc8e81991722c29878 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Fri, 21 Dec 2012 17:29:53 +0100 Subject: [PATCH 11/21] Dash dot pattern --- .../symbology-ng/qgslinesymbollayerv2.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp index 29b6411891d..1142214a559 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp @@ -206,7 +206,24 @@ QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle( double widthScaleFactor ) c symbolStyle.append( ",w:" ); //dxf driver writes ground units as mm? Should probably be changed in ogr symbolStyle.append( QString::number( mWidth * widthScaleFactor ) ); - symbolStyle.append( "g" ); + symbolStyle.append( "mm" ); + + //dash dot vector + if ( mCustomDashVector.size() > 0 ) + { + symbolStyle.append( ",p:\"" ); + QVector::const_iterator pIt = mCustomDashVector.constBegin(); + for ( ; pIt != mCustomDashVector.constEnd(); ++pIt ) + { + if ( pIt != mCustomDashVector.constBegin() ) + { + symbolStyle.append( " " ); + } + symbolStyle.append( QString::number( *pIt * widthScaleFactor ) ); + symbolStyle.append( "mm" ); + } + symbolStyle.append( "\"" ); + } symbolStyle.append( ")" ); return symbolStyle; From d9c79911976d146764bfcbf4fad9d30e9abf7433 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Sun, 23 Dec 2012 15:03:07 +0100 Subject: [PATCH 12/21] Use start / stopRender for renderer in vector symbology export --- src/core/qgsvectorfilewriter.cpp | 52 +++++++++++++++++++ src/core/qgsvectorfilewriter.h | 5 ++ .../symbology-ng/qgslinesymbollayerv2.cpp | 2 +- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index 866d71ad187..392a43f1c0c 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -779,6 +779,8 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, mapUnits = ct->destCRS().mapUnits(); } + writer->startRender( layer ); + // write all features while ( layer->nextFeature( fet ) ) { @@ -839,6 +841,7 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, n++; } + writer->stopRender( layer ); delete writer; if ( shallTransform ) @@ -1241,6 +1244,8 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels mapUnits = ct->destCRS().mapUnits(); } + startRender( layer ); + //fetch features QgsFeature fet; QgsSymbolV2* featureSymbol = 0; @@ -1346,6 +1351,8 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels } } + stopRender( layer ); + if ( nErrors > 0 && errorMessage ) { *errorMessage += QObject::tr( "\nOnly %1 of %2 features written." ).arg( nTotalFeatures - nErrors ).arg( nTotalFeatures ); @@ -1371,3 +1378,48 @@ double QgsVectorFileWriter::widthScaleFactor( double scaleDenominator, QgsSymbol } return 1.0; //todo: map units } + +QgsRenderContext QgsVectorFileWriter::renderContext() const +{ + QgsRenderContext context; + context.setRendererScale( mSymbologyScaleDenominator ); + return context; +} + +void QgsVectorFileWriter::startRender( QgsVectorLayer* vl ) const +{ + QgsFeatureRendererV2* renderer = symbologyRenderer( vl ); + if ( !renderer ) + { + return; + } + + QgsRenderContext ctx = renderContext(); + renderer->startRender( ctx, vl ); +} + +void QgsVectorFileWriter::stopRender( QgsVectorLayer* vl ) const +{ + QgsFeatureRendererV2* renderer = symbologyRenderer( vl ); + if ( !renderer ) + { + return; + } + + QgsRenderContext ctx = renderContext(); + renderer->stopRender( ctx ); +} + +QgsFeatureRendererV2* QgsVectorFileWriter::symbologyRenderer( QgsVectorLayer* vl ) const +{ + if ( mSymbologyExport == NoSymbology ) + { + return 0; + } + if ( !vl || !vl->isUsingRendererV2() ) + { + return 0; + } + + return vl->rendererV2(); +} diff --git a/src/core/qgsvectorfilewriter.h b/src/core/qgsvectorfilewriter.h index 252e18adf92..b30bca5d788 100644 --- a/src/core/qgsvectorfilewriter.h +++ b/src/core/qgsvectorfilewriter.h @@ -204,6 +204,11 @@ class CORE_EXPORT QgsVectorFileWriter /**Writes features considering symbol level order*/ WriterError exportFeaturesSymbolLevels( QgsVectorLayer* layer, const QgsCoordinateTransform* ct, QString* errorMessage = 0 ); double widthScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits ); + QgsRenderContext renderContext() const; + void startRender( QgsVectorLayer* vl ) const; + void stopRender( QgsVectorLayer* vl ) const; + QgsFeatureRendererV2* symbologyRenderer( QgsVectorLayer* vl ) const; + }; #endif diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp index 1142214a559..ef220824b39 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp @@ -209,7 +209,7 @@ QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle( double widthScaleFactor ) c symbolStyle.append( "mm" ); //dash dot vector - if ( mCustomDashVector.size() > 0 ) + if ( mUseCustomDashPattern && mCustomDashVector.size() > 0 ) { symbolStyle.append( ",p:\"" ); QVector::const_iterator pIt = mCustomDashVector.constBegin(); From 7fef39e6f649bef5874b250d36a9d1928d6632b5 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Sun, 23 Dec 2012 16:10:38 +0100 Subject: [PATCH 13/21] Feature style for simple fill --- .../symbology-ng/qgsfillsymbollayerv2.cpp | 11 +++++++++ src/core/symbology-ng/qgsfillsymbollayerv2.h | 2 ++ .../symbology-ng/qgssymbollayerv2utils.cpp | 23 +++++++++++++++++++ src/core/symbology-ng/qgssymbollayerv2utils.h | 8 +++++++ 4 files changed, 44 insertions(+) diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp index ddbcebe3249..0767b220569 100644 --- a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp +++ b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp @@ -175,6 +175,17 @@ void QgsSimpleFillSymbolLayerV2::toSld( QDomDocument &doc, QDomElement &element, QgsSymbolLayerV2Utils::createDisplacementElement( doc, symbolizerElem, mOffset ); } +QString QgsSimpleFillSymbolLayerV2::ogrFeatureStyle( double widthScaleFactor ) const +{ + //brush + QString symbolStyle; + symbolStyle.append( QgsSymbolLayerV2Utils::ogrFeatureStyleBrush( mColor ) ); + symbolStyle.append( ";" ); + //pen + symbolStyle.append( QgsSymbolLayerV2Utils::ogrFeatureStylePen( mBorderWidth * widthScaleFactor, mBorderColor ) ); + return symbolStyle; +} + QgsSymbolLayerV2* QgsSimpleFillSymbolLayerV2::createFromSld( QDomElement &element ) { QgsDebugMsg( "Entered." ); diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.h b/src/core/symbology-ng/qgsfillsymbollayerv2.h index c14fcdb8d7c..e28df5d363a 100644 --- a/src/core/symbology-ng/qgsfillsymbollayerv2.h +++ b/src/core/symbology-ng/qgsfillsymbollayerv2.h @@ -57,6 +57,8 @@ class CORE_EXPORT QgsSimpleFillSymbolLayerV2 : public QgsFillSymbolLayerV2 void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const; + QString ogrFeatureStyle( double widthScaleFactor ) const; + Qt::BrushStyle brushStyle() const { return mBrushStyle; } void setBrushStyle( Qt::BrushStyle style ) { mBrushStyle = style; } diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.cpp b/src/core/symbology-ng/qgssymbollayerv2utils.cpp index 82eaefe69c3..97ed3b104fa 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.cpp +++ b/src/core/symbology-ng/qgssymbollayerv2utils.cpp @@ -2095,6 +2095,29 @@ void QgsSymbolLayerV2Utils::labelTextToSld( QDomDocument &doc, QDomElement &elem } } +QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, const QColor& c ) +{ + QString penStyle; + penStyle.append( "PEN(" ); + penStyle.append( "c:" ); + penStyle.append( c.name() ); + penStyle.append( ",w:" ); + //dxf driver writes ground units as mm? Should probably be changed in ogr + penStyle.append( QString::number( width ) ); + penStyle.append( "mm" ); + return penStyle; +} + +QString QgsSymbolLayerV2Utils::ogrFeatureStyleBrush( const QColor& fillColor ) +{ + QString brushStyle; + brushStyle.append( "BRUSH(" ); + brushStyle.append( "fc:" ); + brushStyle.append( fillColor.name() ); + brushStyle.append( ")" ); + return brushStyle; +} + void QgsSymbolLayerV2Utils::createGeometryElement( QDomDocument &doc, QDomElement &element, QString geomFunc ) { if ( geomFunc.isEmpty() ) diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.h b/src/core/symbology-ng/qgssymbollayerv2utils.h index 3e2467d7060..bee6e8735a0 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.h +++ b/src/core/symbology-ng/qgssymbollayerv2utils.h @@ -164,6 +164,14 @@ class CORE_EXPORT QgsSymbolLayerV2Utils static void labelTextToSld( QDomDocument &doc, QDomElement &element, QString label, QFont font, QColor color = QColor(), double size = -1 ); + /**Create ogr feature style string for pen + @param width linewidth in mm + @param c line color*/ + static QString ogrFeatureStylePen( double width, const QColor& c ); + /**Create ogr feature syle string for brush + @param fillColr fill color*/ + static QString ogrFeatureStyleBrush( const QColor& fillColr ); + static void createRotationElement( QDomDocument &doc, QDomElement &element, QString rotationFunc ); static bool rotationFromSldElement( QDomElement &element, QString &rotationFunc ); From 5327da987cad68e4ee3357763c1085aa48aff912 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Sun, 23 Dec 2012 17:37:39 +0100 Subject: [PATCH 14/21] Fetch attributes for symbology export --- src/core/qgsvectorfilewriter.cpp | 22 +++++++++++++++++++++- src/core/qgsvectorfilewriter.h | 2 ++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index 392a43f1c0c..9d94dc6ae56 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -735,6 +735,8 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, QgsAttributeList allAttr = skipAttributeCreation ? QgsAttributeList() : layer->pendingAllAttributesList(); QgsFeature fet; + //add possible attributes needed by renderer + writer->addRendererAttributes( layer, allAttr ); layer->select( allAttr, QgsRectangle(), layer->wkbType() != QGis::WKBNoGeometry ); const QgsFeatureIds& ids = layer->selectedFeaturesIds(); @@ -810,10 +812,11 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, return ErrProjection; } } - if ( skipAttributeCreation ) + if ( allAttr.size() < 1 && skipAttributeCreation ) { fet.clearAttributeMap(); } + if ( !writer->addFeature( fet, layer->rendererV2(), mapUnits ) ) { WriterError err = writer->hasError(); @@ -1423,3 +1426,20 @@ QgsFeatureRendererV2* QgsVectorFileWriter::symbologyRenderer( QgsVectorLayer* vl return vl->rendererV2(); } + +void QgsVectorFileWriter::addRendererAttributes( QgsVectorLayer* vl, QgsAttributeList& attList ) +{ + QgsFeatureRendererV2* renderer = symbologyRenderer( vl ); + if ( renderer ) + { + QList rendererAttributes = renderer->usedAttributes(); + for ( int i = 0; i < rendererAttributes.size(); ++i ) + { + int index = vl->fieldNameIndex( rendererAttributes.at( i ) ); + if ( index != -1 ) + { + attList.push_back( vl->fieldNameIndex( rendererAttributes.at( i ) ) ); + } + } + } +} diff --git a/src/core/qgsvectorfilewriter.h b/src/core/qgsvectorfilewriter.h index b30bca5d788..57b56b1595f 100644 --- a/src/core/qgsvectorfilewriter.h +++ b/src/core/qgsvectorfilewriter.h @@ -208,6 +208,8 @@ class CORE_EXPORT QgsVectorFileWriter void startRender( QgsVectorLayer* vl ) const; void stopRender( QgsVectorLayer* vl ) const; QgsFeatureRendererV2* symbologyRenderer( QgsVectorLayer* vl ) const; + /**Adds attributes needed for classification*/ + void addRendererAttributes( QgsVectorLayer* vl, QgsAttributeList& attList ); }; From 22731aa826b6c39e4bf7f3a622731dcd5d14333b Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Tue, 25 Dec 2012 11:20:26 +0100 Subject: [PATCH 15/21] Add custom dash dot pattern to symbol layer utils function --- .../symbology-ng/qgsfillsymbollayerv2.cpp | 2 +- .../symbology-ng/qgslinesymbollayerv2.cpp | 34 ++++--------------- .../symbology-ng/qgssymbollayerv2utils.cpp | 23 +++++++++++-- src/core/symbology-ng/qgssymbollayerv2utils.h | 2 +- 4 files changed, 29 insertions(+), 32 deletions(-) diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp index 0767b220569..0f14fe999ea 100644 --- a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp +++ b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp @@ -182,7 +182,7 @@ QString QgsSimpleFillSymbolLayerV2::ogrFeatureStyle( double widthScaleFactor ) c symbolStyle.append( QgsSymbolLayerV2Utils::ogrFeatureStyleBrush( mColor ) ); symbolStyle.append( ";" ); //pen - symbolStyle.append( QgsSymbolLayerV2Utils::ogrFeatureStylePen( mBorderWidth * widthScaleFactor, mBorderColor ) ); + symbolStyle.append( QgsSymbolLayerV2Utils::ogrFeatureStylePen( mBorderWidth, widthScaleFactor, mBorderColor ) ); return symbolStyle; } diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp index ef220824b39..e194f6cd337 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp @@ -197,36 +197,14 @@ void QgsSimpleLineSymbolLayerV2::toSld( QDomDocument &doc, QDomElement &element, QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle( double widthScaleFactor ) const { - QString symbolStyle; - - //pen - symbolStyle.append( "PEN(" ); - symbolStyle.append( "c:" ); - symbolStyle.append( mPen.color().name() ); - symbolStyle.append( ",w:" ); - //dxf driver writes ground units as mm? Should probably be changed in ogr - symbolStyle.append( QString::number( mWidth * widthScaleFactor ) ); - symbolStyle.append( "mm" ); - - //dash dot vector - if ( mUseCustomDashPattern && mCustomDashVector.size() > 0 ) - { - symbolStyle.append( ",p:\"" ); - QVector::const_iterator pIt = mCustomDashVector.constBegin(); - for ( ; pIt != mCustomDashVector.constEnd(); ++pIt ) + if( mUseCustomDashPattern ) { - if ( pIt != mCustomDashVector.constBegin() ) - { - symbolStyle.append( " " ); - } - symbolStyle.append( QString::number( *pIt * widthScaleFactor ) ); - symbolStyle.append( "mm" ); + return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, widthScaleFactor, mPen.color(), &mCustomDashVector ); + } + else + { + return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, widthScaleFactor, mPen.color() ); } - symbolStyle.append( "\"" ); - } - symbolStyle.append( ")" ); - - return symbolStyle; } QgsSymbolLayerV2* QgsSimpleLineSymbolLayerV2::createFromSld( QDomElement &element ) diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.cpp b/src/core/symbology-ng/qgssymbollayerv2utils.cpp index 97ed3b104fa..7779ef84788 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.cpp +++ b/src/core/symbology-ng/qgssymbollayerv2utils.cpp @@ -2095,7 +2095,7 @@ void QgsSymbolLayerV2Utils::labelTextToSld( QDomDocument &doc, QDomElement &elem } } -QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, const QColor& c ) +QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double widthScaleFactor, const QColor& c, const QVector* dashPattern ) { QString penStyle; penStyle.append( "PEN(" ); @@ -2103,8 +2103,27 @@ QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, const QColor& c penStyle.append( c.name() ); penStyle.append( ",w:" ); //dxf driver writes ground units as mm? Should probably be changed in ogr - penStyle.append( QString::number( width ) ); + penStyle.append( QString::number( width * widthScaleFactor ) ); penStyle.append( "mm" ); + + //dash dot vector + if ( dashPattern && dashPattern->size() > 0 ) + { + penStyle.append( ",p:\"" ); + QVector::const_iterator pIt = dashPattern->constBegin(); + for ( ; pIt != dashPattern->constEnd(); ++pIt ) + { + if ( pIt != dashPattern->constBegin() ) + { + penStyle.append( " " ); + } + penStyle.append( QString::number( *pIt * widthScaleFactor ) ); + penStyle.append( "mm" ); + } + penStyle.append( "\"" ); + } + + penStyle.append( ")" ); return penStyle; } diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.h b/src/core/symbology-ng/qgssymbollayerv2utils.h index bee6e8735a0..4db4c38ba15 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.h +++ b/src/core/symbology-ng/qgssymbollayerv2utils.h @@ -167,7 +167,7 @@ class CORE_EXPORT QgsSymbolLayerV2Utils /**Create ogr feature style string for pen @param width linewidth in mm @param c line color*/ - static QString ogrFeatureStylePen( double width, const QColor& c ); + static QString ogrFeatureStylePen( double width, double widthScaleFactor, const QColor& c, const QVector* dashPattern = 0 ); /**Create ogr feature syle string for brush @param fillColr fill color*/ static QString ogrFeatureStyleBrush( const QColor& fillColr ); From faf0abbb3bdd1e41f67b1e8360ecff59868b3630 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Tue, 25 Dec 2012 13:58:34 +0100 Subject: [PATCH 16/21] Write pen cap and join style to ogr pen --- .../symbology-ng/qgslinesymbollayerv2.cpp | 18 +++++----- .../symbology-ng/qgssymbollayerv2utils.cpp | 35 ++++++++++++++++++- src/core/symbology-ng/qgssymbollayerv2utils.h | 5 ++- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp index e194f6cd337..e8a244516ec 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp @@ -197,14 +197,16 @@ void QgsSimpleLineSymbolLayerV2::toSld( QDomDocument &doc, QDomElement &element, QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle( double widthScaleFactor ) const { - if( mUseCustomDashPattern ) - { - return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, widthScaleFactor, mPen.color(), &mCustomDashVector ); - } - else - { - return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, widthScaleFactor, mPen.color() ); - } + if ( mUseCustomDashPattern ) + { + return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, widthScaleFactor, + mPen.color(), mPenJoinStyle, + mPenCapStyle, &mCustomDashVector ); + } + else + { + return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, widthScaleFactor, mPen.color() ); + } } QgsSymbolLayerV2* QgsSimpleLineSymbolLayerV2::createFromSld( QDomElement &element ) diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.cpp b/src/core/symbology-ng/qgssymbollayerv2utils.cpp index 7779ef84788..35d16462994 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.cpp +++ b/src/core/symbology-ng/qgssymbollayerv2utils.cpp @@ -2095,7 +2095,10 @@ void QgsSymbolLayerV2Utils::labelTextToSld( QDomDocument &doc, QDomElement &elem } } -QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double widthScaleFactor, const QColor& c, const QVector* dashPattern ) +QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double widthScaleFactor, const QColor& c, + Qt::PenJoinStyle joinStyle, + Qt::PenCapStyle capStyle, + const QVector* dashPattern ) { QString penStyle; penStyle.append( "PEN(" ); @@ -2123,6 +2126,36 @@ QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double widthSca penStyle.append( "\"" ); } + //cap + penStyle.append( ",cap=" ); + switch ( capStyle ) + { + case Qt::SquareCap: + penStyle.append( "p" ); + break; + case Qt::RoundCap: + penStyle.append( "r" ); + break; + case Qt::FlatCap: + default: + penStyle.append( "b" ); + } + + //join + penStyle.append( ",j=" ); + switch ( joinStyle ) + { + case Qt::BevelJoin: + penStyle.append( "b" ); + break; + case Qt::RoundJoin: + penStyle.append( "r" ); + break; + case Qt::MiterJoin: + default: + penStyle.append( "m" ); + } + penStyle.append( ")" ); return penStyle; } diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.h b/src/core/symbology-ng/qgssymbollayerv2utils.h index 4db4c38ba15..4b2059157b3 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.h +++ b/src/core/symbology-ng/qgssymbollayerv2utils.h @@ -167,7 +167,10 @@ class CORE_EXPORT QgsSymbolLayerV2Utils /**Create ogr feature style string for pen @param width linewidth in mm @param c line color*/ - static QString ogrFeatureStylePen( double width, double widthScaleFactor, const QColor& c, const QVector* dashPattern = 0 ); + static QString ogrFeatureStylePen( double width, double widthScaleFactor, const QColor& c, + Qt::PenJoinStyle joinStyle = Qt::MiterJoin, + Qt::PenCapStyle capStyle = Qt::FlatCap, + const QVector* dashPattern = 0 ); /**Create ogr feature syle string for brush @param fillColr fill color*/ static QString ogrFeatureStyleBrush( const QColor& fillColr ); From 78f26bae131b7af3540651b1caf394f244b4157c Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Tue, 25 Dec 2012 14:44:56 +0100 Subject: [PATCH 17/21] Write offset into ogr pen style --- src/core/symbology-ng/qgslinesymbollayerv2.cpp | 5 +++-- src/core/symbology-ng/qgssymbollayerv2utils.cpp | 13 +++++++++++-- src/core/symbology-ng/qgssymbollayerv2utils.h | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp index e8a244516ec..ca71cdd823c 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp @@ -201,11 +201,12 @@ QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle( double widthScaleFactor ) c { return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, widthScaleFactor, mPen.color(), mPenJoinStyle, - mPenCapStyle, &mCustomDashVector ); + mPenCapStyle, mOffset, &mCustomDashVector ); } else { - return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, widthScaleFactor, mPen.color() ); + return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, widthScaleFactor, mPen.color(), mPenJoinStyle, + mPenCapStyle, mOffset ); } } diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.cpp b/src/core/symbology-ng/qgssymbollayerv2utils.cpp index 35d16462994..f59216d6aee 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.cpp +++ b/src/core/symbology-ng/qgssymbollayerv2utils.cpp @@ -2098,6 +2098,7 @@ void QgsSymbolLayerV2Utils::labelTextToSld( QDomDocument &doc, QDomElement &elem QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double widthScaleFactor, const QColor& c, Qt::PenJoinStyle joinStyle, Qt::PenCapStyle capStyle, + double offset, const QVector* dashPattern ) { QString penStyle; @@ -2127,7 +2128,7 @@ QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double widthSca } //cap - penStyle.append( ",cap=" ); + penStyle.append( ",cap:" ); switch ( capStyle ) { case Qt::SquareCap: @@ -2142,7 +2143,7 @@ QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double widthSca } //join - penStyle.append( ",j=" ); + penStyle.append( ",j:" ); switch ( joinStyle ) { case Qt::BevelJoin: @@ -2156,6 +2157,14 @@ QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double widthSca penStyle.append( "m" ); } + //offset + if ( !doubleNear( offset, 0.0 ) ) + { + penStyle.append( ",dp:" ); + penStyle.append( QString::number( offset * widthScaleFactor ) ); + penStyle.append( "mm" ); + } + penStyle.append( ")" ); return penStyle; } diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.h b/src/core/symbology-ng/qgssymbollayerv2utils.h index 4b2059157b3..82eabcaa37c 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.h +++ b/src/core/symbology-ng/qgssymbollayerv2utils.h @@ -170,6 +170,7 @@ class CORE_EXPORT QgsSymbolLayerV2Utils static QString ogrFeatureStylePen( double width, double widthScaleFactor, const QColor& c, Qt::PenJoinStyle joinStyle = Qt::MiterJoin, Qt::PenCapStyle capStyle = Qt::FlatCap, + double offset = 0.0, const QVector* dashPattern = 0 ); /**Create ogr feature syle string for brush @param fillColr fill color*/ From c74509ef43060c0ed94316985391fb739651201f Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Tue, 25 Dec 2012 15:38:04 +0100 Subject: [PATCH 18/21] Ogr style string for line pattern fill --- src/core/symbology-ng/qgsfillsymbollayerv2.cpp | 15 +++++++++++++++ src/core/symbology-ng/qgsfillsymbollayerv2.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp index 0f14fe999ea..b2204d1acfe 100644 --- a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp +++ b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp @@ -885,6 +885,21 @@ void QgsLinePatternFillSymbolLayer::toSld( QDomDocument &doc, QDomElement &eleme } } +QString QgsLinePatternFillSymbolLayer::ogrFeatureStyle( double widthScaleFactor ) const +{ + QString featureStyle; + featureStyle.append( "Brush(" ); + featureStyle.append( QString( "fc:%1" ).arg( mColor.name() ) ); + featureStyle.append( QString( ",bc:%1" ).arg( "#00000000" ) ); //transparent background + featureStyle.append( ",id:\"ogr-brush-2\"" ); + featureStyle.append( QString( ",a:%1" ).arg( mLineAngle ) ); + featureStyle.append( QString( ",s:%1" ).arg( mLineWidth * widthScaleFactor ) ); + featureStyle.append( ",dx:0mm" ); + featureStyle.append( QString( ",dy:%1mm" ).arg( mDistance * widthScaleFactor ) ); + featureStyle.append( ")" ); + return featureStyle; +} + QgsSymbolLayerV2* QgsLinePatternFillSymbolLayer::createFromSld( QDomElement &element ) { QgsDebugMsg( "Entered." ); diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.h b/src/core/symbology-ng/qgsfillsymbollayerv2.h index e28df5d363a..0eec649741c 100644 --- a/src/core/symbology-ng/qgsfillsymbollayerv2.h +++ b/src/core/symbology-ng/qgsfillsymbollayerv2.h @@ -188,6 +188,8 @@ class CORE_EXPORT QgsLinePatternFillSymbolLayer: public QgsImageFillSymbolLayer void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const; + QString ogrFeatureStyle( double widthScaleFactor ) const; + //getters and setters void setLineAngle( double a ) { mLineAngle = a; } double lineAngle() const { return mLineAngle; } From 891e66523fdf21283ca15533684a57dd8c27f955 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Wed, 26 Dec 2012 12:05:11 +0100 Subject: [PATCH 19/21] Let ogr give ids to created features (otherwise, there are problems with exported dxf files) --- src/core/qgsvectorfilewriter.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index 9d94dc6ae56..8b8e1cd7388 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -502,15 +502,14 @@ OGRFeatureH QgsVectorFileWriter::createFeature( QgsFeature& feature ) if ( fid > std::numeric_limits::max() ) { QgsDebugMsg( QString( "feature id %1 too large." ).arg( fid ) ); - } - - OGRErr err = OGR_F_SetFID( poFeature, static_cast( fid ) ); - if ( err != OGRERR_NONE ) - { - QgsDebugMsg( QString( "Failed to set feature id to %1: %2 (OGR error: %3)" ) - .arg( feature.id() ) - .arg( err ).arg( CPLGetLastErrorMsg() ) - ); + OGRErr err = OGR_F_SetFID( poFeature, static_cast( fid ) ); + if ( err != OGRERR_NONE ) + { + QgsDebugMsg( QString( "Failed to set feature id to %1: %2 (OGR error: %3)" ) + .arg( feature.id() ) + .arg( err ).arg( CPLGetLastErrorMsg() ) + ); + } } // attribute handling From f3bb53f89f0dda61f629e7e9c768b1a3cc7467db Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Thu, 27 Dec 2012 14:12:44 +0100 Subject: [PATCH 20/21] Export ogr feature style in mm for line width and in ground units for line pattern --- src/core/qgsvectorfilewriter.cpp | 35 +++++++++++++++---- src/core/qgsvectorfilewriter.h | 3 +- .../symbology-ng/qgsfillsymbollayerv2.cpp | 4 +-- src/core/symbology-ng/qgsfillsymbollayerv2.h | 2 +- .../symbology-ng/qgslinesymbollayerv2.cpp | 6 ++-- src/core/symbology-ng/qgslinesymbollayerv2.h | 2 +- src/core/symbology-ng/qgssymbollayerv2.h | 2 +- .../symbology-ng/qgssymbollayerv2utils.cpp | 12 +++---- src/core/symbology-ng/qgssymbollayerv2utils.h | 2 +- 9 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index 8b8e1cd7388..0e50199a1b0 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -458,8 +458,10 @@ bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2* { continue; }*/ - double wScaleFactor = widthScaleFactor( mSymbologyScaleDenominator, ( *symbolIt )->outputUnit(), outputUnit ); - currentStyle = ( *symbolIt )->symbolLayer( i )->ogrFeatureStyle( wScaleFactor );//"@" + it.value(); + double mmsf = mmScaleFactor( mSymbologyScaleDenominator, ( *symbolIt )->outputUnit(), outputUnit ); + double musf = mapUnitScaleFactor( mSymbologyScaleDenominator, ( *symbolIt )->outputUnit(), outputUnit ); + + currentStyle = ( *symbolIt )->symbolLayer( i )->ogrFeatureStyle( mmsf, musf );//"@" + it.value(); if ( mSymbologyExport == FeatureSymbology ) { @@ -1214,12 +1216,15 @@ void QgsVectorFileWriter::createSymbolLayerTable( QgsVectorLayer* vl, const Qgs QgsSymbolV2List::iterator symbolIt = symbolList.begin(); for ( ; symbolIt != symbolList.end(); ++symbolIt ) { + double mmsf = mmScaleFactor( mSymbologyScaleDenominator, ( *symbolIt )->outputUnit(), mapUnits ); + double musf = mapUnitScaleFactor( mSymbologyScaleDenominator, ( *symbolIt )->outputUnit(), mapUnits ); + int nLevels = ( *symbolIt )->symbolLayerCount(); for ( int i = 0; i < nLevels; ++i ) { mSymbolLayerTable.insert(( *symbolIt )->symbolLayer( i ), QString::number( nTotalLevels ) ); OGR_SM_AddStyle( styleManager, QString::number( nTotalLevels ).toLocal8Bit(), - ( *symbolIt )->symbolLayer( i )->ogrFeatureStyle( widthScaleFactor( mSymbologyScaleDenominator, ( *symbolIt )->outputUnit(), mapUnits ) ).toLocal8Bit() ); + ( *symbolIt )->symbolLayer( i )->ogrFeatureStyle( mmsf, musf ).toLocal8Bit() ); ++nTotalLevels; } } @@ -1325,6 +1330,9 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels continue; } + double mmsf = mmScaleFactor( mSymbologyScaleDenominator, levelIt.key()->outputUnit(), mapUnits ); + double musf = mapUnitScaleFactor( mSymbologyScaleDenominator, levelIt.key()->outputUnit(), mapUnits ); + int llayer = item.layer(); QList& featureList = levelIt.value(); QList::iterator featureIt = featureList.begin(); @@ -1338,8 +1346,7 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels continue; } - QString styleString = levelIt.key()->symbolLayer( llayer )->ogrFeatureStyle( widthScaleFactor( mSymbologyScaleDenominator, levelIt.key()->outputUnit(), - mapUnits ) ); + QString styleString = levelIt.key()->symbolLayer( llayer )->ogrFeatureStyle( mmsf, musf ); if ( !styleString.isEmpty() ) { OGR_F_SetStyleString( ogrFeature, styleString.toLocal8Bit().data() ); @@ -1363,7 +1370,7 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels return ( nErrors > 0 ) ? QgsVectorFileWriter::ErrFeatureWriteFailed : QgsVectorFileWriter::NoError; } -double QgsVectorFileWriter::widthScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits ) +double QgsVectorFileWriter::mmScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits ) { if ( symbolUnits == QgsSymbolV2::MM ) { @@ -1381,6 +1388,22 @@ double QgsVectorFileWriter::widthScaleFactor( double scaleDenominator, QgsSymbol return 1.0; //todo: map units } +double QgsVectorFileWriter::mapUnitScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits ) +{ + if ( symbolUnits == QgsSymbolV2::MapUnit ) + { + return 1.0; + } + else + { + if ( symbolUnits == QgsSymbolV2::MM && mapUnits == QGis::Meters ) + { + return scaleDenominator / 1000; + } + } + return 1.0; +} + QgsRenderContext QgsVectorFileWriter::renderContext() const { QgsRenderContext context; diff --git a/src/core/qgsvectorfilewriter.h b/src/core/qgsvectorfilewriter.h index 57b56b1595f..26418e1bcb9 100644 --- a/src/core/qgsvectorfilewriter.h +++ b/src/core/qgsvectorfilewriter.h @@ -203,7 +203,8 @@ class CORE_EXPORT QgsVectorFileWriter /**Writes features considering symbol level order*/ WriterError exportFeaturesSymbolLevels( QgsVectorLayer* layer, const QgsCoordinateTransform* ct, QString* errorMessage = 0 ); - double widthScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits ); + double mmScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits ); + double mapUnitScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits ); QgsRenderContext renderContext() const; void startRender( QgsVectorLayer* vl ) const; void stopRender( QgsVectorLayer* vl ) const; diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp index b2204d1acfe..342d824aa82 100644 --- a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp +++ b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp @@ -175,14 +175,14 @@ void QgsSimpleFillSymbolLayerV2::toSld( QDomDocument &doc, QDomElement &element, QgsSymbolLayerV2Utils::createDisplacementElement( doc, symbolizerElem, mOffset ); } -QString QgsSimpleFillSymbolLayerV2::ogrFeatureStyle( double widthScaleFactor ) const +QString QgsSimpleFillSymbolLayerV2::ogrFeatureStyle( double mmScaleFactor, double mapUnitScaleFactor ) const { //brush QString symbolStyle; symbolStyle.append( QgsSymbolLayerV2Utils::ogrFeatureStyleBrush( mColor ) ); symbolStyle.append( ";" ); //pen - symbolStyle.append( QgsSymbolLayerV2Utils::ogrFeatureStylePen( mBorderWidth, widthScaleFactor, mBorderColor ) ); + symbolStyle.append( QgsSymbolLayerV2Utils::ogrFeatureStylePen( mBorderWidth, mmScaleFactor, mapUnitScaleFactor, mBorderColor ) ); return symbolStyle; } diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.h b/src/core/symbology-ng/qgsfillsymbollayerv2.h index 0eec649741c..fd6b7a39eb7 100644 --- a/src/core/symbology-ng/qgsfillsymbollayerv2.h +++ b/src/core/symbology-ng/qgsfillsymbollayerv2.h @@ -57,7 +57,7 @@ class CORE_EXPORT QgsSimpleFillSymbolLayerV2 : public QgsFillSymbolLayerV2 void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const; - QString ogrFeatureStyle( double widthScaleFactor ) const; + QString ogrFeatureStyle( double mmScaleFactor, double mapUnitScaleFactor ) const; Qt::BrushStyle brushStyle() const { return mBrushStyle; } void setBrushStyle( Qt::BrushStyle style ) { mBrushStyle = style; } diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp index ca71cdd823c..55bfd5a0946 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp @@ -195,17 +195,17 @@ void QgsSimpleLineSymbolLayerV2::toSld( QDomDocument &doc, QDomElement &element, } } -QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle( double widthScaleFactor ) const +QString QgsSimpleLineSymbolLayerV2::ogrFeatureStyle( double mmScaleFactor, double mapUnitScaleFactor ) const { if ( mUseCustomDashPattern ) { - return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, widthScaleFactor, + return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, mmScaleFactor, mapUnitScaleFactor, mPen.color(), mPenJoinStyle, mPenCapStyle, mOffset, &mCustomDashVector ); } else { - return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, widthScaleFactor, mPen.color(), mPenJoinStyle, + return QgsSymbolLayerV2Utils::ogrFeatureStylePen( mWidth, mmScaleFactor, mapUnitScaleFactor, mPen.color(), mPenJoinStyle, mPenCapStyle, mOffset ); } } diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.h b/src/core/symbology-ng/qgslinesymbollayerv2.h index 9fd91b20f49..cc2fe7c729f 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.h +++ b/src/core/symbology-ng/qgslinesymbollayerv2.h @@ -56,7 +56,7 @@ class CORE_EXPORT QgsSimpleLineSymbolLayerV2 : public QgsLineSymbolLayerV2 void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const; - QString ogrFeatureStyle( double widthScaleFactor ) const; + QString ogrFeatureStyle( double mmScaleFactor, double mapUnitScaleFactor ) const; // new stuff diff --git a/src/core/symbology-ng/qgssymbollayerv2.h b/src/core/symbology-ng/qgssymbollayerv2.h index 2252ba69c7b..23eb99073d8 100644 --- a/src/core/symbology-ng/qgssymbollayerv2.h +++ b/src/core/symbology-ng/qgssymbollayerv2.h @@ -54,7 +54,7 @@ class CORE_EXPORT QgsSymbolLayerV2 virtual void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const { Q_UNUSED( props ); element.appendChild( doc.createComment( QString( "SymbolLayerV2 %1 not implemented yet" ).arg( layerType() ) ) ); } - virtual QString ogrFeatureStyle( double widthScaleFactor ) const { Q_UNUSED( widthScaleFactor ); return QString(); } + virtual QString ogrFeatureStyle( double mmScaleFactor, double mapUnitScaleFactor ) const { Q_UNUSED( mmScaleFactor ); Q_UNUSED( mapUnitScaleFactor ); return QString(); } virtual QgsStringMap properties() const = 0; diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.cpp b/src/core/symbology-ng/qgssymbollayerv2utils.cpp index f59216d6aee..219903be54c 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.cpp +++ b/src/core/symbology-ng/qgssymbollayerv2utils.cpp @@ -2095,7 +2095,7 @@ void QgsSymbolLayerV2Utils::labelTextToSld( QDomDocument &doc, QDomElement &elem } } -QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double widthScaleFactor, const QColor& c, +QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double mmScaleFactor, double mapUnitScaleFactor, const QColor& c, Qt::PenJoinStyle joinStyle, Qt::PenCapStyle capStyle, double offset, @@ -2107,7 +2107,7 @@ QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double widthSca penStyle.append( c.name() ); penStyle.append( ",w:" ); //dxf driver writes ground units as mm? Should probably be changed in ogr - penStyle.append( QString::number( width * widthScaleFactor ) ); + penStyle.append( QString::number( width * mmScaleFactor ) ); penStyle.append( "mm" ); //dash dot vector @@ -2121,8 +2121,8 @@ QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double widthSca { penStyle.append( " " ); } - penStyle.append( QString::number( *pIt * widthScaleFactor ) ); - penStyle.append( "mm" ); + penStyle.append( QString::number( *pIt * mapUnitScaleFactor ) ); + penStyle.append( "g" ); } penStyle.append( "\"" ); } @@ -2161,8 +2161,8 @@ QString QgsSymbolLayerV2Utils::ogrFeatureStylePen( double width, double widthSca if ( !doubleNear( offset, 0.0 ) ) { penStyle.append( ",dp:" ); - penStyle.append( QString::number( offset * widthScaleFactor ) ); - penStyle.append( "mm" ); + penStyle.append( QString::number( offset * mapUnitScaleFactor ) ); + penStyle.append( "g" ); } penStyle.append( ")" ); diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.h b/src/core/symbology-ng/qgssymbollayerv2utils.h index 82eabcaa37c..7edff9100f3 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.h +++ b/src/core/symbology-ng/qgssymbollayerv2utils.h @@ -167,7 +167,7 @@ class CORE_EXPORT QgsSymbolLayerV2Utils /**Create ogr feature style string for pen @param width linewidth in mm @param c line color*/ - static QString ogrFeatureStylePen( double width, double widthScaleFactor, const QColor& c, + static QString ogrFeatureStylePen( double width, double mmScaleFactor, double mapUnitsScaleFactor, const QColor& c, Qt::PenJoinStyle joinStyle = Qt::MiterJoin, Qt::PenCapStyle capStyle = Qt::FlatCap, double offset = 0.0, From 9f9ce3290f3ce8b02ed14a8bc3bae7e3de2c4d0c Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Thu, 27 Dec 2012 14:25:21 +0100 Subject: [PATCH 21/21] Disable scale field if no symbology export --- src/app/ogr/qgsvectorlayersaveasdialog.cpp | 12 ++++++++++++ src/app/ogr/qgsvectorlayersaveasdialog.h | 1 + 2 files changed, 13 insertions(+) diff --git a/src/app/ogr/qgsvectorlayersaveasdialog.cpp b/src/app/ogr/qgsvectorlayersaveasdialog.cpp index 914b4774a34..5bba03699fb 100644 --- a/src/app/ogr/qgsvectorlayersaveasdialog.cpp +++ b/src/app/ogr/qgsvectorlayersaveasdialog.cpp @@ -67,6 +67,7 @@ QgsVectorLayerSaveAsDialog::QgsVectorLayerSaveAsDialog( long srsid, QWidget* par mSymbologyExportComboBox->addItem( tr( "No symbology" ), QgsVectorFileWriter::NoSymbology ); mSymbologyExportComboBox->addItem( tr( "Feature symbology" ), QgsVectorFileWriter::FeatureSymbology ); mSymbologyExportComboBox->addItem( tr( "Symbol layer symbology" ), QgsVectorFileWriter::SymbolLayerSymbology ); + on_mSymbologyExportComboBox_currentIndexChanged( mSymbologyExportComboBox->currentText() ); } QgsVectorLayerSaveAsDialog::~QgsVectorLayerSaveAsDialog() @@ -205,3 +206,14 @@ double QgsVectorLayerSaveAsDialog::scaleDenominator() const { return mScaleSpinBox->value(); } + +void QgsVectorLayerSaveAsDialog::on_mSymbologyExportComboBox_currentIndexChanged( const QString& text ) +{ + bool scaleEnabled = true; + if ( text == tr( "No symbology" ) ) + { + scaleEnabled = false; + } + mScaleSpinBox->setEnabled( scaleEnabled ); + mScaleLabel->setEnabled( scaleEnabled ); +} diff --git a/src/app/ogr/qgsvectorlayersaveasdialog.h b/src/app/ogr/qgsvectorlayersaveasdialog.h index 63fe2951949..149976c013f 100644 --- a/src/app/ogr/qgsvectorlayersaveasdialog.h +++ b/src/app/ogr/qgsvectorlayersaveasdialog.h @@ -54,6 +54,7 @@ class QgsVectorLayerSaveAsDialog : public QDialog, private Ui::QgsVectorLayerSav void on_browseFilename_clicked(); void on_browseCRS_clicked(); void on_buttonBox_helpRequested() { QgsContextHelp::run( metaObject()->className() ); } + void on_mSymbologyExportComboBox_currentIndexChanged( const QString& text ); void accept(); private: