[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
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"

View File

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

View File

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

View File

@ -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() )

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" ) );
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() );
}

View File

@ -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;

View File

@ -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 )
{

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.
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 )

View File

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