[FEATURE]: add option to export all lines with minimal width in dxf export

This commit is contained in:
Marco Hugentobler 2024-04-26 09:48:16 +02:00 committed by Nyall Dawson
parent 6dc910c1e7
commit 37efb0b7af
9 changed files with 136 additions and 99 deletions

View File

@ -1,6 +1,7 @@
# The following has been generated automatically from src/core/dxf/qgsdxfexport.h # The following has been generated automatically from src/core/dxf/qgsdxfexport.h
QgsDxfExport.FlagNoMText = QgsDxfExport.Flag.FlagNoMText QgsDxfExport.FlagNoMText = QgsDxfExport.Flag.FlagNoMText
QgsDxfExport.FlagOnlySelectedFeatures = QgsDxfExport.Flag.FlagOnlySelectedFeatures QgsDxfExport.FlagOnlySelectedFeatures = QgsDxfExport.Flag.FlagOnlySelectedFeatures
QgsDxfExport.FlagHairlineWidthExport = QgsDxfExport.Flag.FlagHairlineWidthExport
QgsDxfExport.Flags = lambda flags=0: QgsDxfExport.Flag(flags) QgsDxfExport.Flags = lambda flags=0: QgsDxfExport.Flag(flags)
# monkey patching scoped based enum # monkey patching scoped based enum
QgsDxfExport.ExportResult.Success.__doc__ = "Successful export" QgsDxfExport.ExportResult.Success.__doc__ = "Successful export"

View File

@ -82,6 +82,7 @@ Returns the overridden layer name to be used in the exported DXF.
{ {
FlagNoMText, FlagNoMText,
FlagOnlySelectedFeatures, FlagOnlySelectedFeatures,
FlagHairlineWidthExport
}; };
typedef QFlags<QgsDxfExport::Flag> Flags; typedef QFlags<QgsDxfExport::Flag> Flags;

View File

@ -82,6 +82,7 @@ Returns the overridden layer name to be used in the exported DXF.
{ {
FlagNoMText, FlagNoMText,
FlagOnlySelectedFeatures, FlagOnlySelectedFeatures,
FlagHairlineWidthExport
}; };
typedef QFlags<QgsDxfExport::Flag> Flags; typedef QFlags<QgsDxfExport::Flag> Flags;

View File

@ -6871,6 +6871,8 @@ void QgisApp::dxfExport()
flags = flags | QgsDxfExport::FlagNoMText; flags = flags | QgsDxfExport::FlagNoMText;
if ( d.selectedFeaturesOnly() ) if ( d.selectedFeaturesOnly() )
flags = flags | QgsDxfExport::FlagOnlySelectedFeatures; flags = flags | QgsDxfExport::FlagOnlySelectedFeatures;
if ( d.hairlineWidthExport() )
flags = flags | QgsDxfExport::FlagHairlineWidthExport;
dxfExport.setFlags( flags ); dxfExport.setFlags( flags );
if ( auto *lMapCanvas = mapCanvas() ) if ( auto *lMapCanvas = mapCanvas() )

View File

@ -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" ) ); 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" ) ); 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" ) ); 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(); QStringList ids = QgsProject::instance()->mapThemeCollection()->mapThemes();
ids.prepend( QString() ); ids.prepend( QString() );
@ -1054,6 +1055,11 @@ bool QgsDxfExportDialog::loadSettingsFromXML( QDomDocument &doc, QString &errorM
if ( !value.isNull() ) if ( !value.isNull() )
mSelectedFeaturesOnly->setChecked( value == true ); 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; return true;
} }
@ -1177,6 +1183,11 @@ void QgsDxfExportDialog::saveSettingsToXML( QDomDocument &doc ) const
selectedFeatures.appendChild( QgsXmlUtils::writeVariant( selectedFeaturesOnly(), doc ) ); selectedFeatures.appendChild( QgsXmlUtils::writeVariant( selectedFeaturesOnly(), doc ) );
dxfElement.appendChild( selectedFeatures ); dxfElement.appendChild( selectedFeatures );
QDomElement hairlineWidthExportElem = domDocument.createElement( QStringLiteral( "hairline_width_export" ) );
hairlineWidthExportElem.appendChild( QgsXmlUtils::writeVariant( hairlineWidthExport(), doc ) );
dxfElement.appendChild( hairlineWidthExportElem );
doc = domDocument; doc = domDocument;
} }
@ -1252,6 +1263,11 @@ bool QgsDxfExportDialog::useMText() const
return mMTextCheckBox->isChecked(); return mMTextCheckBox->isChecked();
} }
bool QgsDxfExportDialog::hairlineWidthExport() const
{
return mHairlineWidthExportCheckBox->isChecked();
}
void QgsDxfExportDialog::saveSettings() void QgsDxfExportDialog::saveSettings()
{ {
QgsSettings settings; QgsSettings settings;
@ -1266,6 +1282,7 @@ void QgsDxfExportDialog::saveSettings()
settings.setValue( QStringLiteral( "qgis/lastDxfCrs" ), QString::number( mCRS.srsid() ) ); settings.setValue( QStringLiteral( "qgis/lastDxfCrs" ), QString::number( mCRS.srsid() ) );
settings.setValue( QStringLiteral( "qgis/lastDxfUseMText" ), mMTextCheckBox->isChecked() ); settings.setValue( QStringLiteral( "qgis/lastDxfUseMText" ), mMTextCheckBox->isChecked() );
settings.setValue( QStringLiteral( "qgis/lastDxfForce2d" ), mForce2d->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( "/lastDxfSymbologyMode" ), mSymbologyModeComboBox->currentIndex() );
QgsProject::instance()->writeEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastSymbologyExportScale" ), mScaleWidget->scale() != 0 ? 1.0 / mScaleWidget->scale() : 0 ); 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( "/lastDxfCrs" ), QString::number( mCRS.srsid() ) );
QgsProject::instance()->writeEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfUseMText" ), mMTextCheckBox->isChecked() ); QgsProject::instance()->writeEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfUseMText" ), mMTextCheckBox->isChecked() );
QgsProject::instance()->writeEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfForce2d" ), mForce2d->isChecked() ); QgsProject::instance()->writeEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfForce2d" ), mForce2d->isChecked() );
QgsProject::instance()->writeEntry( QStringLiteral( "dxf" ), QStringLiteral( "/lastDxfHairlineWidthExport" ), mHairlineWidthExportCheckBox->isChecked() );
mModel->saveLayersOutputAttribute( mModel->rootGroup() ); mModel->saveLayersOutputAttribute( mModel->rootGroup() );
} }

View File

@ -119,6 +119,7 @@ class QgsDxfExportDialog : public QDialog, private Ui::QgsDxfExportDialogBase
bool layerTitleAsName() const; bool layerTitleAsName() const;
bool force2d() const; bool force2d() const;
bool useMText() const; bool useMText() const;
bool hairlineWidthExport() const;
QString mapTheme() const; QString mapTheme() const;
QString encoding() const; QString encoding() const;
QgsCoordinateReferenceSystem crs() const; QgsCoordinateReferenceSystem crs() const;

View File

@ -1763,6 +1763,11 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
offset = 0.0; offset = 0.0;
} }
if ( mFlags & FlagHairlineWidthExport )
{
width = 0;
}
QString lineStyleName = QStringLiteral( "CONTINUOUS" ); QString lineStyleName = QStringLiteral( "CONTINUOUS" );
if ( mSymbologyExport != Qgis::FeatureSymbologyExport::NoSymbology ) if ( mSymbologyExport != Qgis::FeatureSymbologyExport::NoSymbology )
{ {

View File

@ -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. 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. 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 ) Q_DECLARE_FLAGS( Flags, Flag )

View File

@ -30,7 +30,7 @@
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QgsFileWidget" name="mFileName"/> <widget class="QgsFileWidget" name="mFileName" native="true"/>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="mSymbologyModeLabel"> <widget class="QLabel" name="mSymbologyModeLabel">
@ -62,11 +62,11 @@
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QgsScaleWidget" name="mScaleWidget"> <widget class="QgsScaleWidget" name="mScaleWidget" native="true">
<property name="focusPolicy"> <property name="focusPolicy">
<enum>Qt::StrongFocus</enum> <enum>Qt::StrongFocus</enum>
</property> </property>
<property name="showCurrentScaleButton"> <property name="showCurrentScaleButton" stdset="0">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
@ -101,7 +101,7 @@
</widget> </widget>
</item> </item>
<item row="4" column="1"> <item row="4" column="1">
<widget class="QgsProjectionSelectionWidget" name="mCrsSelector"> <widget class="QgsProjectionSelectionWidget" name="mCrsSelector" native="true">
<property name="focusPolicy"> <property name="focusPolicy">
<enum>Qt::StrongFocus</enum> <enum>Qt::StrongFocus</enum>
</property> </property>
@ -216,6 +216,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1">
<widget class="QCheckBox" name="mHairlineWidthExportCheckBox">
<property name="text">
<string>Export minimum line width</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item row="15" column="0" colspan="2"> <item row="15" column="0" colspan="2">