Skip to content

Commit 6b62019

Browse files
committed
QgsVectorFileWriter: fix DGN creation (fixes #19722, fixes #19723)
1 parent 35c954e commit 6b62019

File tree

3 files changed

+64
-9
lines changed

3 files changed

+64
-9
lines changed

src/core/qgsvectorfilewriter.cpp

+11-7
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ QgsVectorFileWriter::QgsVectorFileWriter( const QString &vectorFileName,
140140

141141
bool QgsVectorFileWriter::supportsFeatureStyles( const QString &driverName )
142142
{
143+
if ( driverName == QLatin1String( "MapInfo MIF" ) )
144+
{
145+
return true;
146+
}
143147
#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,3,0)
144148
GDALDriverH gdalDriver = GDALGetDriverByName( driverName.toLocal8Bit().constData() );
145149
if ( !gdalDriver )
@@ -151,7 +155,7 @@ bool QgsVectorFileWriter::supportsFeatureStyles( const QString &driverName )
151155

152156
return CSLFetchBoolean( driverMetadata, GDAL_DCAP_FEATURE_STYLES, false );
153157
#else
154-
return driverName == QLatin1String( "DXF" ) || driverName == QLatin1String( "KML" ) || driverName == QLatin1String( "MapInfo File" ) || driverName == QLatin1String( "MapInfo MIF" );
158+
return driverName == QLatin1String( "DXF" ) || driverName == QLatin1String( "KML" ) || driverName == QLatin1String( "MapInfo File" );
155159
#endif
156160
}
157161

@@ -415,16 +419,16 @@ void QgsVectorFileWriter::init( QString vectorFileName,
415419
// disable encoding conversion of OGR Shapefile layer
416420
CPLSetConfigOption( "SHAPE_ENCODING", "" );
417421

418-
if ( driverName == QLatin1String( "DGN" ) )
419-
{
420-
mLayer = OGR_DS_GetLayerByName( mDS.get(), "elements" );
421-
}
422-
else if ( action == CreateOrOverwriteFile || action == CreateOrOverwriteLayer )
422+
if ( action == CreateOrOverwriteFile || action == CreateOrOverwriteLayer )
423423
{
424424
mLayer = OGR_DS_CreateLayer( mDS.get(), layerName.toUtf8().constData(), mOgrRef, wkbType, options );
425-
if ( newLayer )
425+
if ( newLayer && mLayer )
426426
*newLayer = OGR_L_GetName( mLayer );
427427
}
428+
else if ( driverName == QLatin1String( "DGN" ) )
429+
{
430+
mLayer = OGR_DS_GetLayerByName( mDS.get(), "elements" );
431+
}
428432
else
429433
{
430434
mLayer = OGR_DS_GetLayerByName( mDS.get(), layerName.toUtf8().constData() );

src/gui/ogr/qgsvectorlayersaveasdialog.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,11 @@ QStringList QgsVectorLayerSaveAsDialog::datasourceOptions() const
758758
}
759759
}
760760

761-
return options + mOgrDatasourceOptions->toPlainText().split( '\n' );
761+
QString plainText = mOgrDatasourceOptions->toPlainText().trimmed();
762+
if ( !plainText.isEmpty() )
763+
options += plainText.split( '\n' );
764+
765+
return options;
762766
}
763767

764768
QStringList QgsVectorLayerSaveAsDialog::layerOptions() const
@@ -813,7 +817,11 @@ QStringList QgsVectorLayerSaveAsDialog::layerOptions() const
813817
}
814818
}
815819

816-
return options + mOgrLayerOptions->toPlainText().split( '\n' );
820+
QString plainText = mOgrLayerOptions->toPlainText().trimmed();
821+
if ( !plainText.isEmpty() )
822+
options += plainText.split( '\n' );
823+
824+
return options;
817825
}
818826

819827
QgsAttributeList QgsVectorLayerSaveAsDialog::selectedAttributes() const

tests/src/python/test_qgsvectorfilewriter.py

+43
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ def testWriteWithLongLongField(self):
116116
idx = vl.fields().indexFromName('fldlonglong')
117117
self.assertEqual(vl.getFeature(1).attributes()[idx], 2262000000)
118118

119+
del vl
120+
os.unlink(filename + '.gpkg')
121+
119122
def testWriteWithBoolField(self):
120123

121124
# init connection string
@@ -156,6 +159,9 @@ def testWriteWithBoolField(self):
156159
self.assertEqual(vl.getFeature(1).attributes()[idx], 1)
157160
self.assertEqual(vl.getFeature(2).attributes()[idx], 0)
158161

162+
del vl
163+
os.unlink(filename + '.gpkg')
164+
159165
def testDateTimeWriteShapefile(self):
160166
"""Check writing date and time fields to an ESRI shapefile."""
161167
ml = QgsVectorLayer(
@@ -939,6 +945,43 @@ def testOverwriteGPKG(self):
939945
options)
940946
self.assertEqual(write_result, QgsVectorFileWriter.NoError, error_message)
941947

948+
def testCreateDGN(self):
949+
ml = QgsVectorLayer('Point?crs=epsg:4326', 'test', 'memory')
950+
provider = ml.dataProvider()
951+
feat = QgsFeature()
952+
feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(10, 10)))
953+
provider.addFeatures([feat])
954+
955+
filename = os.path.join(str(QDir.tempPath()), 'testCreateDGN.dgn')
956+
crs = QgsCoordinateReferenceSystem()
957+
crs.createFromId(4326, QgsCoordinateReferenceSystem.EpsgCrsId)
958+
rc, errmsg = QgsVectorFileWriter.writeAsVectorFormat(ml, filename, 'utf-8', crs, 'DGN')
959+
960+
# open the resulting file
961+
vl = QgsVectorLayer(filename, '', 'ogr')
962+
self.assertTrue(vl.isValid())
963+
self.assertEqual(vl.featureCount(), 1)
964+
del vl
965+
966+
# append
967+
options = QgsVectorFileWriter.SaveVectorOptions()
968+
options.driverName = 'DGN'
969+
options.layerName = 'test'
970+
options.actionOnExistingFile = QgsVectorFileWriter.AppendToLayerNoNewFields
971+
write_result, error_message = QgsVectorFileWriter.writeAsVectorFormat(
972+
ml,
973+
filename,
974+
options)
975+
self.assertEqual(write_result, QgsVectorFileWriter.NoError, error_message)
976+
977+
# open the resulting file
978+
vl = QgsVectorLayer(filename, '', 'ogr')
979+
self.assertTrue(vl.isValid())
980+
self.assertEqual(vl.featureCount(), 2)
981+
del vl
982+
983+
os.unlink(filename)
984+
942985

943986
if __name__ == '__main__':
944987
unittest.main()

0 commit comments

Comments
 (0)