Skip to content

Commit

Permalink
Possibility of choosing symbology export method in export dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
mhugent committed Dec 17, 2012
1 parent c5010df commit ce0b0b9
Show file tree
Hide file tree
Showing 6 changed files with 188 additions and 86 deletions.
10 changes: 10 additions & 0 deletions src/app/ogr/qgsvectorlayersaveasdialog.cpp
Expand Up @@ -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()
Expand Down Expand Up @@ -190,3 +195,8 @@ bool QgsVectorLayerSaveAsDialog::addToCanvas() const
{
return mAddToCanvas->isChecked();
}

int QgsVectorLayerSaveAsDialog::symbologyExport() const
{
return mSymbologyExportComboBox->itemData( mSymbologyExportComboBox->currentIndex() ).toInt();
}
5 changes: 5 additions & 0 deletions src/app/ogr/qgsvectorlayersaveasdialog.h
Expand Up @@ -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 );
Expand Down
3 changes: 2 additions & 1 deletion src/app/qgisapp.cpp
Expand Up @@ -4204,7 +4204,8 @@ void QgisApp::saveAsVectorFileGeneral( bool saveOnlySelection )
&errorMessage,
datasourceOptions, dialog->layerOptions(),
dialog->skipAttributeCreation(),
&newFilename );
&newFilename,
( QgsVectorFileWriter::SymbologyExport )( dialog->symbologyExport() ) );

QApplication::restoreOverrideCursor();

Expand Down
106 changes: 88 additions & 18 deletions src/core/qgsvectorfilewriter.cpp
Expand Up @@ -26,6 +26,7 @@
#include "qgsvectorfilewriter.h"
#include "qgsrendererv2.h"
#include "qgssymbolv2.h"
#include "qgssymbollayerv2.h"

#include <QFile>
#include <QSettings>
Expand Down Expand Up @@ -571,43 +572,67 @@ 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;

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( ";" );
/*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;
}
}
}
styleString.append( currentStyle );
}

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 )
{
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( poFeature );
OGR_F_Destroy( feature );
return false;
}

OGR_F_Destroy( poFeature );

return true;
}

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 );
}
6 changes: 6 additions & 0 deletions src/core/qgsvectorfilewriter.h
Expand Up @@ -27,7 +27,9 @@
typedef void *OGRDataSourceH;
typedef void *OGRLayerH;
typedef void *OGRGeometryH;
typedef void *OGRFeatureH;

class QgsSymbolLayerV2;
class QTextCodec;

/** \ingroup core
Expand Down Expand Up @@ -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
144 changes: 77 additions & 67 deletions src/ui/qgsvectorlayersaveasdialogbase.ui
Expand Up @@ -14,24 +14,20 @@
<string>Save vector layer as...</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="1">
<widget class="QLineEdit" name="leFilename">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
<item row="0" column="1" colspan="2">
<widget class="QComboBox" name="mFormatComboBox"/>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="leCRS">
<property name="enabled">
<bool>false</bool>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Format</string>
</property>
<property name="readOnly">
<bool>true</bool>
<property name="buddy">
<cstring>mFormatComboBox</cstring>
</property>
</widget>
</item>
<item row="8" column="0" colspan="3">
<item row="9" column="0" colspan="3">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
Expand All @@ -41,60 +37,7 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Save as</string>
</property>
<property name="buddy">
<cstring>leFilename</cstring>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="browseFilename">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QPushButton" name="browseCRS">
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QComboBox" name="mEncodingComboBox"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Encoding</string>
</property>
<property name="buddy">
<cstring>mEncodingComboBox</cstring>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Format</string>
</property>
<property name="buddy">
<cstring>mFormatComboBox</cstring>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QComboBox" name="mFormatComboBox"/>
</item>
<item row="7" column="0" colspan="3">
<item row="8" column="0" colspan="3">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>OGR creation options</string>
Expand Down Expand Up @@ -149,6 +92,56 @@
<item row="5" column="1" colspan="2">
<widget class="QComboBox" name="mCRSSelection"/>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="leCRS">
<property name="enabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QComboBox" name="mEncodingComboBox"/>
</item>
<item row="6" column="2">
<widget class="QPushButton" name="browseCRS">
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="browseFilename">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Save as</string>
</property>
<property name="buddy">
<cstring>leFilename</cstring>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Encoding</string>
</property>
<property name="buddy">
<cstring>mEncodingComboBox</cstring>
</property>
</widget>
</item>
<item row="5" column="0" rowspan="2">
<widget class="QLabel" name="label_3">
<property name="text">
Expand All @@ -159,6 +152,23 @@
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="leFilename">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="7" column="1" colspan="2">
<widget class="QComboBox" name="mSymbologyExportComboBox"/>
</item>
<item row="7" column="0">
<widget class="QLabel" name="mSymbologyExportLabel">
<property name="text">
<string>Symbology export</string>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
Expand Down

0 comments on commit ce0b0b9

Please sign in to comment.