From 37efb0b7afb1ae51f6596882d8de97d01ce3a6d6 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Fri, 26 Apr 2024 09:48:16 +0200 Subject: [PATCH] [FEATURE]: add option to export all lines with minimal width in dxf export --- .../PyQt6/core/auto_additions/qgsdxfexport.py | 1 + .../auto_generated/dxf/qgsdxfexport.sip.in | 1 + .../auto_generated/dxf/qgsdxfexport.sip.in | 1 + src/app/qgisapp.cpp | 2 + src/app/qgsdxfexportdialog.cpp | 18 ++ src/app/qgsdxfexportdialog.h | 1 + src/core/dxf/qgsdxfexport.cpp | 5 + src/core/dxf/qgsdxfexport.h | 1 + src/ui/qgsdxfexportdialogbase.ui | 205 +++++++++--------- 9 files changed, 136 insertions(+), 99 deletions(-) diff --git a/python/PyQt6/core/auto_additions/qgsdxfexport.py b/python/PyQt6/core/auto_additions/qgsdxfexport.py index 349d7a111ef..3c3b9062b38 100644 --- a/python/PyQt6/core/auto_additions/qgsdxfexport.py +++ b/python/PyQt6/core/auto_additions/qgsdxfexport.py @@ -1,6 +1,7 @@ # The following has been generated automatically from src/core/dxf/qgsdxfexport.h QgsDxfExport.FlagNoMText = QgsDxfExport.Flag.FlagNoMText QgsDxfExport.FlagOnlySelectedFeatures = QgsDxfExport.Flag.FlagOnlySelectedFeatures +QgsDxfExport.FlagHairlineWidthExport = QgsDxfExport.Flag.FlagHairlineWidthExport QgsDxfExport.Flags = lambda flags=0: QgsDxfExport.Flag(flags) # monkey patching scoped based enum QgsDxfExport.ExportResult.Success.__doc__ = "Successful export" diff --git a/python/PyQt6/core/auto_generated/dxf/qgsdxfexport.sip.in b/python/PyQt6/core/auto_generated/dxf/qgsdxfexport.sip.in index 84d4ed600f8..e58045777da 100644 --- a/python/PyQt6/core/auto_generated/dxf/qgsdxfexport.sip.in +++ b/python/PyQt6/core/auto_generated/dxf/qgsdxfexport.sip.in @@ -82,6 +82,7 @@ Returns the overridden layer name to be used in the exported DXF. { FlagNoMText, FlagOnlySelectedFeatures, + FlagHairlineWidthExport }; typedef QFlags Flags; diff --git a/python/core/auto_generated/dxf/qgsdxfexport.sip.in b/python/core/auto_generated/dxf/qgsdxfexport.sip.in index 95d1c0996c3..6651d20115c 100644 --- a/python/core/auto_generated/dxf/qgsdxfexport.sip.in +++ b/python/core/auto_generated/dxf/qgsdxfexport.sip.in @@ -82,6 +82,7 @@ Returns the overridden layer name to be used in the exported DXF. { FlagNoMText, FlagOnlySelectedFeatures, + FlagHairlineWidthExport }; typedef QFlags Flags; diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 84f643c23b3..ef19405bf43 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -6871,6 +6871,8 @@ void QgisApp::dxfExport() flags = flags | QgsDxfExport::FlagNoMText; if ( d.selectedFeaturesOnly() ) flags = flags | QgsDxfExport::FlagOnlySelectedFeatures; + if ( d.hairlineWidthExport() ) + flags = flags | QgsDxfExport::FlagHairlineWidthExport; dxfExport.setFlags( flags ); if ( auto *lMapCanvas = mapCanvas() ) diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp index 6644a58a4be..bc8981cf410 100644 --- a/src/app/qgsdxfexportdialog.cpp +++ b/src/app/qgsdxfexportdialog.cpp @@ -804,6 +804,7 @@ QgsDxfExportDialog::QgsDxfExportDialog( QWidget *parent, Qt::WindowFlags f ) mSelectedFeaturesOnly->setChecked( QgsProject::instance()->readEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfSelectedFeaturesOnly" ), settings.value( QStringLiteral( "qgis/lastDxfSelectedFeaturesOnly" ), "false" ).toString() ) != QLatin1String( "false" ) ); mMTextCheckBox->setChecked( QgsProject::instance()->readEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfUseMText" ), settings.value( QStringLiteral( "qgis/lastDxfUseMText" ), "true" ).toString() ) != QLatin1String( "false" ) ); mForce2d->setChecked( QgsProject::instance()->readEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfForce2d" ), settings.value( QStringLiteral( "qgis/lastDxfForce2d" ), "false" ).toString() ) != QLatin1String( "false" ) ); + mHairlineWidthExportCheckBox->setChecked( QgsProject::instance()->readEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfHairlineWidthExport" ), settings.value( QStringLiteral( "qgis/lastDxfHairlineWidthExport" ), "false" ).toString() ) != QLatin1String( "false" ) ); QStringList ids = QgsProject::instance()->mapThemeCollection()->mapThemes(); ids.prepend( QString() ); @@ -1054,6 +1055,11 @@ bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorM if ( !value.isNull() ) mSelectedFeaturesOnly->setChecked( value == true ); + element = dxfElement.namedItem( QStringLiteral( "hairline_width_export" ) ).toElement(); + value = QgsXmlUtils::readVariant( element.firstChildElement() ); + if ( !value.isNull() ) + mHairlineWidthExportCheckBox->setChecked( value == true ); + return true; } @@ -1177,6 +1183,11 @@ void QgsDxfExportDialog::saveSettingsToXML( QDomDocument &doc ) const selectedFeatures.appendChild( QgsXmlUtils::writeVariant( selectedFeaturesOnly(), doc ) ); dxfElement.appendChild( selectedFeatures ); + QDomElement hairlineWidthExportElem = domDocument.createElement( QStringLiteral( "hairline_width_export" ) ); + hairlineWidthExportElem.appendChild( QgsXmlUtils::writeVariant( hairlineWidthExport(), doc ) ); + dxfElement.appendChild( hairlineWidthExportElem ); + + doc = domDocument; } @@ -1252,6 +1263,11 @@ bool QgsDxfExportDialog::useMText() const return mMTextCheckBox->isChecked(); } +bool QgsDxfExportDialog::hairlineWidthExport() const +{ + return mHairlineWidthExportCheckBox->isChecked(); +} + void QgsDxfExportDialog::saveSettings() { QgsSettings settings; @@ -1266,6 +1282,7 @@ void QgsDxfExportDialog::saveSettings() settings.setValue( QStringLiteral( "qgis/lastDxfCrs" ), QString::number( mCRS.srsid() ) ); settings.setValue( QStringLiteral( "qgis/lastDxfUseMText" ), mMTextCheckBox->isChecked() ); settings.setValue( QStringLiteral( "qgis/lastDxfForce2d" ), mForce2d->isChecked() ); + settings.setValue( QStringLiteral( "qgis/lastDxfHairlineWidthExport" ), mHairlineWidthExportCheckBox->isChecked() ); QgsProject::instance()->writeEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfSymbologyMode" ), mSymbologyModeComboBox->currentIndex() ); QgsProject::instance()->writeEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastSymbologyExportScale" ), mScaleWidget->scale() != 0 ? 1.0 / mScaleWidget->scale() : 0 ); @@ -1277,6 +1294,7 @@ void QgsDxfExportDialog::saveSettings() QgsProject::instance()->writeEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfCrs" ), QString::number( mCRS.srsid() ) ); QgsProject::instance()->writeEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfUseMText" ), mMTextCheckBox->isChecked() ); QgsProject::instance()->writeEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfForce2d" ), mForce2d->isChecked() ); + QgsProject::instance()->writeEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfHairlineWidthExport" ), mHairlineWidthExportCheckBox->isChecked() ); mModel->saveLayersOutputAttribute( mModel->rootGroup() ); } diff --git a/src/app/qgsdxfexportdialog.h b/src/app/qgsdxfexportdialog.h index 0a696617f65..ec61f043e7c 100644 --- a/src/app/qgsdxfexportdialog.h +++ b/src/app/qgsdxfexportdialog.h @@ -119,6 +119,7 @@ class QgsDxfExportDialog : public QDialog, private Ui::QgsDxfExportDialogBase bool layerTitleAsName() const; bool force2d() const; bool useMText() const; + bool hairlineWidthExport() const; QString mapTheme() const; QString encoding() const; QgsCoordinateReferenceSystem crs() const; diff --git a/src/core/dxf/qgsdxfexport.cpp b/src/core/dxf/qgsdxfexport.cpp index b34c48c0b37..095ccf649fc 100644 --- a/src/core/dxf/qgsdxfexport.cpp +++ b/src/core/dxf/qgsdxfexport.cpp @@ -1763,6 +1763,11 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT offset = 0.0; } + if ( mFlags & FlagHairlineWidthExport ) + { + width = 0; + } + QString lineStyleName = QStringLiteral( "CONTINUOUS" ); if ( mSymbologyExport != Qgis::FeatureSymbologyExport::NoSymbology ) { diff --git a/src/core/dxf/qgsdxfexport.h b/src/core/dxf/qgsdxfexport.h index 5622dc68d54..2d2cec86bb3 100644 --- a/src/core/dxf/qgsdxfexport.h +++ b/src/core/dxf/qgsdxfexport.h @@ -147,6 +147,7 @@ class CORE_EXPORT QgsDxfExport : public QgsLabelSink { FlagNoMText = 1 << 1, //!< Export text as TEXT elements. If not set, text will be exported as MTEXT elements. FlagOnlySelectedFeatures = 1 << 2, //!< Use only selected features for the export. + FlagHairlineWidthExport = 1 << 3 //!Export all lines with minimum width and don't fill polygons. Since QGIS 3.38 }; Q_DECLARE_FLAGS( Flags, Flag ) diff --git a/src/ui/qgsdxfexportdialogbase.ui b/src/ui/qgsdxfexportdialogbase.ui index 39f0bd71b90..5b9878d7de7 100644 --- a/src/ui/qgsdxfexportdialogbase.ui +++ b/src/ui/qgsdxfexportdialogbase.ui @@ -30,7 +30,7 @@ - + @@ -62,11 +62,11 @@ - + Qt::StrongFocus - + true @@ -101,7 +101,7 @@ - + Qt::StrongFocus @@ -123,114 +123,121 @@ - - - - - - - - - - - Select All Layers - + + + - - - - Deselect All Layers - - + + + + + + Select All Layers + + + + + + + Deselect All Layers + + + + + + + Select Data Defined Blocks + + + + + + + Deselect Data Defined Blocks + + + + - - - - Select Data Defined Blocks - - + + + + + + Export features intersecting the current map extent + + + + + + + If no attribute is chosen and layer name is not being overridden, prefer layer title (set in layer properties) to layer name. + + + Use layer title as name if set + + + + + + + Force 2d output (eg. to support polyline width) + + + + + + + Export labels as MTEXT elements + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Use only selected features + + + + + + + Export minimum line width + + + + - - - - Deselect Data Defined Blocks - - - - - - - - - - - Export features intersecting the current map extent - - - - - - - If no attribute is chosen and layer name is not being overridden, prefer layer title (set in layer properties) to layer name. - - - Use layer title as name if set - - - - - - - Force 2d output (eg. to support polyline width) - - - - - - - Export labels as MTEXT elements - - - true - - - - - + + Qt::Horizontal - - - 40 - 20 - - - - - - - - Use only selected features + + QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok - - - - -