Skip to content

Commit ce0b0b9

Browse files
committed
Possibility of choosing symbology export method in export dialog
1 parent c5010df commit ce0b0b9

6 files changed

+188
-86
lines changed

src/app/ogr/qgsvectorlayersaveasdialog.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ QgsVectorLayerSaveAsDialog::QgsVectorLayerSaveAsDialog( long srsid, QWidget* par
6262

6363
mEncodingComboBox->setCurrentIndex( idx );
6464
on_mFormatComboBox_currentIndexChanged( mFormatComboBox->currentIndex() );
65+
66+
//symbology export combo box
67+
mSymbologyExportComboBox->addItem( tr( "No symbology" ), QgsVectorFileWriter::NoSymbology );
68+
mSymbologyExportComboBox->addItem( tr( "Feature symbology" ), QgsVectorFileWriter::FeatureSymbology );
69+
mSymbologyExportComboBox->addItem( tr( "Symbol layer symbology" ), QgsVectorFileWriter::SymbolLayerSymbology );
6570
}
6671

6772
QgsVectorLayerSaveAsDialog::~QgsVectorLayerSaveAsDialog()
@@ -190,3 +195,8 @@ bool QgsVectorLayerSaveAsDialog::addToCanvas() const
190195
{
191196
return mAddToCanvas->isChecked();
192197
}
198+
199+
int QgsVectorLayerSaveAsDialog::symbologyExport() const
200+
{
201+
return mSymbologyExportComboBox->itemData( mSymbologyExportComboBox->currentIndex() ).toInt();
202+
}

src/app/ogr/qgsvectorlayersaveasdialog.h

+5
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ class QgsVectorLayerSaveAsDialog : public QDialog, private Ui::QgsVectorLayerSav
4141
long crs() const;
4242
bool skipAttributeCreation() const;
4343
bool addToCanvas() const;
44+
/**Returns type of symbology export.
45+
0: No symbology
46+
1: Feature symbology
47+
2: Symbol level symbology*/
48+
int symbologyExport() const;
4449

4550
private slots:
4651
void on_mFormatComboBox_currentIndexChanged( int idx );

src/app/qgisapp.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -4204,7 +4204,8 @@ void QgisApp::saveAsVectorFileGeneral( bool saveOnlySelection )
42044204
&errorMessage,
42054205
datasourceOptions, dialog->layerOptions(),
42064206
dialog->skipAttributeCreation(),
4207-
&newFilename );
4207+
&newFilename,
4208+
( QgsVectorFileWriter::SymbologyExport )( dialog->symbologyExport() ) );
42084209

42094210
QApplication::restoreOverrideCursor();
42104211

src/core/qgsvectorfilewriter.cpp

+88-18
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "qgsvectorfilewriter.h"
2727
#include "qgsrendererv2.h"
2828
#include "qgssymbolv2.h"
29+
#include "qgssymbollayerv2.h"
2930

3031
#include <QFile>
3132
#include <QSettings>
@@ -571,43 +572,67 @@ bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2*
571572
//add OGR feature style type
572573
if ( mSymbologyExport != NoSymbology && renderer )
573574
{
574-
//concatenate ogr styles of all symbols
575+
//SymbolLayerSymbology: concatenate ogr styles of all symbollayers
575576
QgsSymbolV2List symbols = renderer->symbolsForFeature( feature );
576577
QString styleString;
577578
QString currentStyle;
578579

579580
QgsSymbolV2List::const_iterator symbolIt = symbols.constBegin();
580581
for ( ; symbolIt != symbols.constEnd(); ++symbolIt )
581582
{
582-
currentStyle = ( *symbolIt )->ogrFeatureStyle();
583-
if ( currentStyle.isEmpty() )
583+
int nSymbolLayers = ( *symbolIt )->symbolLayerCount();
584+
for ( int i = 0; i < nSymbolLayers; ++i )
584585
{
585-
continue;
586-
}
587-
if ( symbolIt != symbols.constBegin() )
588-
{
589-
styleString.append( ";" );
586+
/*QMap< QgsSymbolLayerV2*, QString >::const_iterator it = mSymbolLayerTable.find( (*symbolIt)->symbolLayer( i ) );
587+
if( it == mSymbolLayerTable.constEnd() )
588+
{
589+
continue;
590+
}*/
591+
currentStyle = ( *symbolIt )->symbolLayer( i )->ogrFeatureStyle();//"@" + it.value();
592+
593+
if ( mSymbologyExport == FeatureSymbology )
594+
{
595+
if ( symbolIt != symbols.constBegin() || i != 0 )
596+
{
597+
styleString.append( ";" );
598+
}
599+
styleString.append( currentStyle );
600+
}
601+
else if ( mSymbologyExport == SymbolLayerSymbology )
602+
{
603+
OGR_F_SetStyleString( poFeature, currentStyle.toLocal8Bit().data() );
604+
if ( !createFeature( mLayer, poFeature ) )
605+
{
606+
return false;
607+
}
608+
}
590609
}
591-
styleString.append( currentStyle );
592610
}
593-
594611
OGR_F_SetStyleString( poFeature, styleString.toLocal8Bit().data() );
595612
}
596613

597-
// put the created feature to layer
598-
if ( OGR_L_CreateFeature( mLayer, poFeature ) != OGRERR_NONE )
614+
if ( mSymbologyExport == NoSymbology || mSymbologyExport == FeatureSymbology )
615+
{
616+
if ( !createFeature( mLayer, poFeature ) )
617+
{
618+
return false;
619+
}
620+
}
621+
622+
OGR_F_Destroy( poFeature );
623+
return true;
624+
}
625+
626+
bool QgsVectorFileWriter::createFeature( OGRLayerH layer, OGRFeatureH feature )
627+
{
628+
if ( OGR_L_CreateFeature( layer, feature ) != OGRERR_NONE )
599629
{
600630
mErrorMessage = QObject::tr( "Feature creation error (OGR error: %1)" ).arg( QString::fromUtf8( CPLGetLastErrorMsg() ) );
601631
mError = ErrFeatureWriteFailed;
602-
603632
QgsMessageLog::logMessage( mErrorMessage, QObject::tr( "OGR" ) );
604-
605-
OGR_F_Destroy( poFeature );
633+
OGR_F_Destroy( feature );
606634
return false;
607635
}
608-
609-
OGR_F_Destroy( poFeature );
610-
611636
return true;
612637
}
613638

@@ -718,6 +743,12 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer,
718743
shallTransform = false;
719744
}
720745

746+
//create symbol table if neede
747+
/*if( writer->symbologyExport() != NoSymbology )
748+
{
749+
writer->createSymbolLayerTable( layer, writer->mDS );
750+
}*/
751+
721752
int n = 0, errors = 0;
722753

723754
// write all features
@@ -1114,3 +1145,42 @@ bool QgsVectorFileWriter::driverMetadata( QString driverName, QString &longName,
11141145

11151146
return true;
11161147
}
1148+
1149+
void QgsVectorFileWriter::createSymbolLayerTable( QgsVectorLayer* vl, OGRDataSourceH ds )
1150+
{
1151+
if ( !vl || !ds )
1152+
{
1153+
return;
1154+
}
1155+
1156+
if ( !vl->isUsingRendererV2() )
1157+
{
1158+
return;
1159+
}
1160+
1161+
QgsFeatureRendererV2* renderer = vl->rendererV2();
1162+
if ( !renderer )
1163+
{
1164+
return;
1165+
}
1166+
1167+
mSymbolLayerTable.clear();
1168+
OGRStyleTableH ogrStyleTable = OGR_STBL_Create();
1169+
OGRStyleMgrH styleManager = OGR_SM_Create( ogrStyleTable );
1170+
1171+
//get symbols
1172+
int nTotalLevels = 0;
1173+
QgsSymbolV2List symbolList = renderer->symbols();
1174+
QgsSymbolV2List::iterator symbolIt = symbolList.begin();
1175+
for ( ; symbolIt != symbolList.end(); ++symbolIt )
1176+
{
1177+
int nLevels = ( *symbolIt )->symbolLayerCount();
1178+
for ( int i = 0; i < nLevels; ++i )
1179+
{
1180+
mSymbolLayerTable.insert(( *symbolIt )->symbolLayer( i ), QString::number( nTotalLevels ) );
1181+
OGR_SM_AddStyle( styleManager, QString::number( nTotalLevels ).toLocal8Bit(), ( *symbolIt )->ogrFeatureStyle().toLocal8Bit() );
1182+
++nTotalLevels;
1183+
}
1184+
}
1185+
OGR_DS_SetStyleTableDirectly( ds, ogrStyleTable );
1186+
}

src/core/qgsvectorfilewriter.h

+6
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
typedef void *OGRDataSourceH;
2828
typedef void *OGRLayerH;
2929
typedef void *OGRGeometryH;
30+
typedef void *OGRFeatureH;
3031

32+
class QgsSymbolLayerV2;
3133
class QTextCodec;
3234

3335
/** \ingroup core
@@ -183,8 +185,12 @@ class CORE_EXPORT QgsVectorFileWriter
183185

184186
SymbologyExport mSymbologyExport;
185187

188+
QMap< QgsSymbolLayerV2*, QString > mSymbolLayerTable;
189+
186190
private:
187191
static bool driverMetadata( QString driverName, QString &longName, QString &trLongName, QString &glob, QString &ext );
192+
void createSymbolLayerTable( QgsVectorLayer* vl, OGRDataSourceH ds );
193+
bool createFeature( OGRLayerH layer, OGRFeatureH feature );
188194
};
189195

190196
#endif

src/ui/qgsvectorlayersaveasdialogbase.ui

+77-67
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,20 @@
1414
<string>Save vector layer as...</string>
1515
</property>
1616
<layout class="QGridLayout" name="gridLayout">
17-
<item row="1" column="1">
18-
<widget class="QLineEdit" name="leFilename">
19-
<property name="enabled">
20-
<bool>false</bool>
21-
</property>
22-
</widget>
17+
<item row="0" column="1" colspan="2">
18+
<widget class="QComboBox" name="mFormatComboBox"/>
2319
</item>
24-
<item row="6" column="1">
25-
<widget class="QLineEdit" name="leCRS">
26-
<property name="enabled">
27-
<bool>false</bool>
20+
<item row="0" column="0">
21+
<widget class="QLabel" name="label_2">
22+
<property name="text">
23+
<string>Format</string>
2824
</property>
29-
<property name="readOnly">
30-
<bool>true</bool>
25+
<property name="buddy">
26+
<cstring>mFormatComboBox</cstring>
3127
</property>
3228
</widget>
3329
</item>
34-
<item row="8" column="0" colspan="3">
30+
<item row="9" column="0" colspan="3">
3531
<widget class="QDialogButtonBox" name="buttonBox">
3632
<property name="orientation">
3733
<enum>Qt::Horizontal</enum>
@@ -41,60 +37,7 @@
4137
</property>
4238
</widget>
4339
</item>
44-
<item row="1" column="0">
45-
<widget class="QLabel" name="label">
46-
<property name="text">
47-
<string>Save as</string>
48-
</property>
49-
<property name="buddy">
50-
<cstring>leFilename</cstring>
51-
</property>
52-
</widget>
53-
</item>
54-
<item row="1" column="2">
55-
<widget class="QPushButton" name="browseFilename">
56-
<property name="enabled">
57-
<bool>false</bool>
58-
</property>
59-
<property name="text">
60-
<string>Browse</string>
61-
</property>
62-
</widget>
63-
</item>
64-
<item row="6" column="2">
65-
<widget class="QPushButton" name="browseCRS">
66-
<property name="text">
67-
<string>Browse</string>
68-
</property>
69-
</widget>
70-
</item>
71-
<item row="4" column="1" colspan="2">
72-
<widget class="QComboBox" name="mEncodingComboBox"/>
73-
</item>
74-
<item row="4" column="0">
75-
<widget class="QLabel" name="label_4">
76-
<property name="text">
77-
<string>Encoding</string>
78-
</property>
79-
<property name="buddy">
80-
<cstring>mEncodingComboBox</cstring>
81-
</property>
82-
</widget>
83-
</item>
84-
<item row="0" column="0">
85-
<widget class="QLabel" name="label_2">
86-
<property name="text">
87-
<string>Format</string>
88-
</property>
89-
<property name="buddy">
90-
<cstring>mFormatComboBox</cstring>
91-
</property>
92-
</widget>
93-
</item>
94-
<item row="0" column="1" colspan="2">
95-
<widget class="QComboBox" name="mFormatComboBox"/>
96-
</item>
97-
<item row="7" column="0" colspan="3">
40+
<item row="8" column="0" colspan="3">
9841
<widget class="QGroupBox" name="groupBox">
9942
<property name="title">
10043
<string>OGR creation options</string>
@@ -149,6 +92,56 @@
14992
<item row="5" column="1" colspan="2">
15093
<widget class="QComboBox" name="mCRSSelection"/>
15194
</item>
95+
<item row="6" column="1">
96+
<widget class="QLineEdit" name="leCRS">
97+
<property name="enabled">
98+
<bool>false</bool>
99+
</property>
100+
<property name="readOnly">
101+
<bool>true</bool>
102+
</property>
103+
</widget>
104+
</item>
105+
<item row="4" column="1" colspan="2">
106+
<widget class="QComboBox" name="mEncodingComboBox"/>
107+
</item>
108+
<item row="6" column="2">
109+
<widget class="QPushButton" name="browseCRS">
110+
<property name="text">
111+
<string>Browse</string>
112+
</property>
113+
</widget>
114+
</item>
115+
<item row="1" column="2">
116+
<widget class="QPushButton" name="browseFilename">
117+
<property name="enabled">
118+
<bool>false</bool>
119+
</property>
120+
<property name="text">
121+
<string>Browse</string>
122+
</property>
123+
</widget>
124+
</item>
125+
<item row="1" column="0">
126+
<widget class="QLabel" name="label">
127+
<property name="text">
128+
<string>Save as</string>
129+
</property>
130+
<property name="buddy">
131+
<cstring>leFilename</cstring>
132+
</property>
133+
</widget>
134+
</item>
135+
<item row="4" column="0">
136+
<widget class="QLabel" name="label_4">
137+
<property name="text">
138+
<string>Encoding</string>
139+
</property>
140+
<property name="buddy">
141+
<cstring>mEncodingComboBox</cstring>
142+
</property>
143+
</widget>
144+
</item>
152145
<item row="5" column="0" rowspan="2">
153146
<widget class="QLabel" name="label_3">
154147
<property name="text">
@@ -159,6 +152,23 @@
159152
</property>
160153
</widget>
161154
</item>
155+
<item row="1" column="1">
156+
<widget class="QLineEdit" name="leFilename">
157+
<property name="enabled">
158+
<bool>false</bool>
159+
</property>
160+
</widget>
161+
</item>
162+
<item row="7" column="1" colspan="2">
163+
<widget class="QComboBox" name="mSymbologyExportComboBox"/>
164+
</item>
165+
<item row="7" column="0">
166+
<widget class="QLabel" name="mSymbologyExportLabel">
167+
<property name="text">
168+
<string>Symbology export</string>
169+
</property>
170+
</widget>
171+
</item>
162172
</layout>
163173
</widget>
164174
<tabstops>

0 commit comments

Comments
 (0)