QGIS API Documentation 3.34.0-Prizren (ffbdd678812)
Loading...
Searching...
No Matches
qgsdxfexport.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsdxfexport.h
3 --------------
4 begin : September 2013
5 copyright : (C) 2013 by Marco Hugentobler
6 email : marco at sourcepole dot ch
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#ifndef QGSDXFEXPORT_H
19#define QGSDXFEXPORT_H
20
21#include "qgis_core.h"
22#include "qgis_sip.h"
23#include "qgis.h"
24#include "qgsgeometry.h"
25#include "qgsmapsettings.h"
26#include "qgslabelsink.h"
27#include "qgsrendercontext.h"
28
29#include <QColor>
30#include <QList>
31#include <QTextStream>
32
33class QgsMapLayer;
34class QgsPointXY;
35class QgsSymbolLayer;
36class QIODevice;
38class QgsCurve;
39class QgsCurvePolygon;
42struct DxfLayerJob;
44
45#define DXF_HANDSEED 100
46#define DXF_HANDMAX 9999999
47#define DXF_HANDPLOTSTYLE 0xf
48
49namespace pal // SIP_SKIP
50{
51 class LabelPosition;
52}
53
54
60#ifdef SIP_RUN
61class CORE_EXPORT QgsDxfExport
62{
63#else
64class CORE_EXPORT QgsDxfExport : public QgsLabelSink
65{
66#endif
67 public:
68
73 struct CORE_EXPORT DxfLayer
74 {
75 DxfLayer( QgsVectorLayer *vl, int layerOutputAttributeIndex = -1 )
76 : mLayer( vl )
77 , mLayerOutputAttributeIndex( layerOutputAttributeIndex )
78 {}
79
81 QgsVectorLayer *layer() const {return mLayer;}
82
88 int layerOutputAttributeIndex() const {return mLayerOutputAttributeIndex;}
89
96 QString splitLayerAttribute() const;
97
98 private:
99 QgsVectorLayer *mLayer = nullptr;
100 int mLayerOutputAttributeIndex = -1;
101 };
102
104 enum Flag
105 {
106 FlagNoMText = 1 << 1,
107 };
108 Q_DECLARE_FLAGS( Flags, Flag )
109
110
115 enum class ExportResult
116 {
117 Success = 0,
118 InvalidDeviceError,
119 DeviceNotWritableError,
120 EmptyExtentError
121 };
122
126 enum class VAlign : int
127 {
128 VBaseLine = 0,
129 VBottom = 1,
130 VMiddle = 2,
131 VTop = 3,
132 Undefined = 9999
133 };
134
136 enum class HAlign : int
137 {
138 HLeft = 0,
139 HCenter = 1,
140 HRight = 2,
141 HAligned = 3,
142 HMiddle = 4,
143 HFit = 5,
144 Undefined = 9999
145 };
146
153 {
154 Closed = 1,
155 Curve = 2,
156 Spline = 4,
157 Is3DPolyline = 8,
158 Is3DPolygonMesh = 16,
159 PolygonMesh = 32,
160 PolyfaceMesh = 64,
161 ContinuousPattern = 128,
162 };
163
164 Q_DECLARE_FLAGS( DxfPolylineFlags, DxfPolylineFlag )
165
166
170
171 ~QgsDxfExport() override;
172
177 void setMapSettings( const QgsMapSettings &settings );
178
184 void setFlags( QgsDxfExport::Flags flags );
185
191 QgsDxfExport::Flags flags() const;
192
198 void addLayers( const QList< QgsDxfExport::DxfLayer > &layers );
199
206 ExportResult writeToFile( QIODevice *d, const QString &codec ); //maybe add progress dialog? other parameters (e.g. scale, dpi)?
207
214 void setSymbologyScale( double scale ) { mSymbologyScale = scale; }
215
222 double symbologyScale() const { return mSymbologyScale; }
223
228 Qgis::DistanceUnit mapUnits() const;
229
235 void setDestinationCrs( const QgsCoordinateReferenceSystem &crs );
236
242 QgsCoordinateReferenceSystem destinationCrs() const;
243
248 void setSymbologyExport( Qgis::FeatureSymbologyExport e ) { mSymbologyExport = e; }
249
255 Qgis::FeatureSymbologyExport symbologyExport() const { return mSymbologyExport; }
256
261 void setExtent( const QgsRectangle &r ) { mExtent = r; }
262
268 QgsRectangle extent() const { return mExtent; }
269
276 void setLayerTitleAsName( bool layerTitleAsName ) { mLayerTitleAsName = layerTitleAsName; }
277
283 bool layerTitleAsName() { return mLayerTitleAsName; }
284
290 void setForce2d( bool force2d ) { mForce2d = force2d; }
291
297 bool force2d() { return mForce2d; }
298
303 static int closestColorMatch( QRgb color );
304
311 QString layerName( const QString &id, const QgsFeature &f ) const;
312
319 QString layerName( QgsVectorLayer *vl ) const;
320
327 void writeGroup( int code, int i ) SIP_PYNAME( writeGroupInt );
328
335 void writeGroup( int code, long long i ) SIP_PYNAME( writeGroupLong );
336
343 void writeGroup( int code, double d ) SIP_PYNAME( writeGroupDouble );
344
350 void writeGroup( int code, const QString &s );
351
359 void writeGroup( int code, const QgsPoint &p ) SIP_PYNAME( writeGroupPointV2 );
360
369 void writeGroup( const QColor &color, int exactMatch = 62, int rgbCode = 420, int transparencyCode = 440 );
370
375 void writeGroupCode( int code );
376
381 void writeInt( int i );
382
387 void writeDouble( double d );
388
393 void writeString( const QString &s );
394
401 int writeHandle( int code = 5, int handle = 0 );
402
413 void writePolyline( const QgsPointSequence &line, const QString &layer, const QString &lineStyleName, const QColor &color, double width = -1 ) SIP_SKIP;
414
425 void writePolyline( const QgsCurve &curve, const QString &layer, const QString &lineStyleName, const QColor &color, double width = -1 ) SIP_SKIP;
426
436 void writePolygon( const QgsRingSequence &polygon, const QString &layer, const QString &hatchPattern, const QColor &color ) SIP_SKIP;
437
447 void writePolygon( const QgsCurvePolygon &polygon, const QString &layer, const QString &hatchPattern, const QColor &color ) SIP_SKIP;
448
453 void writeLine( const QgsPoint &pt1, const QgsPoint &pt2, const QString &layer, const QString &lineStyleName, const QColor &color, double width = -1 );
454
460 void writePoint( const QString &layer, const QColor &color, const QgsPoint &pt ) SIP_PYNAME( writePointV2 );
461
467 void writeFilledCircle( const QString &layer, const QColor &color, const QgsPoint &pt, double radius ) SIP_PYNAME( writeFillCircleV2 );
468
474 void writeCircle( const QString &layer, const QColor &color, const QgsPoint &pt, double radius, const QString &lineStyleName, double width ) SIP_PYNAME( writeCircleV2 );
475
481 void writeText( const QString &layer, const QString &text, const QgsPoint &pt, double size, double angle, const QColor &color, QgsDxfExport::HAlign hali = QgsDxfExport::HAlign::Undefined, QgsDxfExport::VAlign vali = QgsDxfExport::VAlign::Undefined ) SIP_PYNAME( writeTextV2 );
482
488 void writeMText( const QString &layer, const QString &text, const QgsPoint &pt, double width, double angle, const QColor &color );
489
497 static double mapUnitScaleFactor( double scale, Qgis::RenderUnit symbolUnits, Qgis::DistanceUnit mapUnits, double mapUnitsPerPixel = 1.0 );
498
505 void clipValueToMapUnitScale( double &value, const QgsMapUnitScale &scale, double pixelToMMFactor ) const;
506
508 static QString dxfLayerName( const QString &name );
509
511 static QString dxfEncoding( const QString &name );
512
514 static QStringList encodings();
515
521 void drawLabel( const QString &layerId, QgsRenderContext &context, pal::LabelPosition *label, const QgsPalLayerSettings &settings ) SIP_SKIP override;
522
531 Q_DECL_DEPRECATED void registerDxfLayer( const QString &layerId, QgsFeatureId fid, const QString &layer );
532
533 private:
534
535#ifdef SIP_RUN
536 QgsDxfExport( const QgsDxfExport &other );
537 QgsDxfExport &operator=( const QgsDxfExport & );
538#endif
540 QgsRectangle mExtent;
542 double mSymbologyScale = 1.0;
545 bool mLayerTitleAsName = false;
546
547 QTextStream mTextStream;
548
549 int mSymbolLayerCounter = 0; //internal counter
550 int mNextHandleId = DXF_HANDSEED;
551 int mBlockCounter = 0;
552
553 QHash< const QgsSymbolLayer *, QString > mLineStyles; //symbol layer name types
554 QHash< const QgsSymbolLayer *, QString > mPointSymbolBlocks; //reference to point symbol blocks
555 QHash< const QgsSymbolLayer *, double > mPointSymbolBlockSizes; //reference to point symbol size used to create its block
556 QHash< const QgsSymbolLayer *, double > mPointSymbolBlockAngles; //reference to point symbol size used to create its block
557
558 //AC1009
559 void writeHeader( const QString &codepage );
560 void prepareRenderers();
561 void writeTables();
562 void writeBlocks();
563 void writeEntities();
564 void writeEntitiesSymbolLevels( DxfLayerJob *job );
565 void stopRenderers();
566 void writeEndFile();
567
568 void startSection();
569 void endSection();
570
571 void writePoint( const QgsPoint &pt, const QString &layer, const QColor &color, QgsSymbolRenderContext &ctx, const QgsSymbolLayer *symbolLayer, const QgsSymbol *symbol, double angle );
572 void writeDefaultLinetypes();
573 void writeSymbolLayerLinetype( const QgsSymbolLayer *symbolLayer );
574 void writeLinetype( const QString &styleName, const QVector<qreal> &pattern, Qgis::RenderUnit u );
575
579 void writeText( const QString &layer, const QString &text, pal::LabelPosition *label, const QgsPalLayerSettings &layerSettings, const QgsExpressionContext &expressionContext );
580
590 void addGeometryGeneratorSymbolLayer( QgsSymbolRenderContext &context, const QgsCoordinateTransform &ct, const QString &layer, QgsSymbolLayer *symbolLayer, bool allSymbolLayers );
591
601 void addFeature( QgsSymbolRenderContext &context, const QgsCoordinateTransform &ct, const QString &layer, const QgsSymbolLayer *symbolLayer, const QgsSymbol *symbol );
602
603 //returns dxf palette index from symbol layer color
604 static QColor colorFromSymbolLayer( const QgsSymbolLayer *symbolLayer, QgsSymbolRenderContext &ctx );
605 QString lineStyleFromSymbolLayer( const QgsSymbolLayer *symbolLayer );
606
607 //functions for dxf palette
608 static int color_distance( QRgb p1, int index );
609 static QRgb createRgbEntry( qreal r, qreal g, qreal b );
610
611 //helper functions for symbology export
612 QgsRenderContext renderContext() const;
613
614 QList< QPair< QgsSymbolLayer *, QgsSymbol * > > symbolLayers( QgsRenderContext &context );
615 static int nLineTypes( const QList< QPair< QgsSymbolLayer *, QgsSymbol *> > &symbolLayers );
616 static bool hasBlockBreakingDataDefinedProperties( const QgsSymbolLayer *sl, const QgsSymbol *symbol );
617
618 double dashSize() const;
619 double dotSize() const;
620 double dashSeparatorSize() const;
621 double sizeToMapUnits( double s ) const;
622 static QString lineNameFromPenStyle( Qt::PenStyle style );
623 bool layerIsScaleBasedVisible( const QgsMapLayer *layer ) const;
624
625 QHash<QString, int> mBlockHandles;
626 QString mBlockHandle;
627
629 QMap< QString, QMap<QgsFeatureId, QString> > mDxfLayerNames;
631 QgsMapSettings mMapSettings;
632 QHash<QString, int> mLayerNameAttribute;
633 double mFactor = 1.0;
634 bool mForce2d = false;
635
636 QgsDxfExport::Flags mFlags = QgsDxfExport::Flags();
637
638 void appendCurve( const QgsCurve &c, QVector<QgsPoint> &points, QVector<double> &bulges );
639 void appendLineString( const QgsLineString &ls, QVector<QgsPoint> &points, QVector<double> &bulges );
640 void appendCircularString( const QgsCircularString &cs, QVector<QgsPoint> &points, QVector<double> &bulges );
641 void appendCompoundCurve( const QgsCompoundCurve &cc, QVector<QgsPoint> &points, QVector<double> &bulges );
642
643 QgsRenderContext mRenderContext;
644 // Internal cache for layer related information required during rendering
645 QList<DxfLayerJob *> mJobs;
646 std::unique_ptr<QgsLabelingEngine> mLabelingEngine;
647};
648
649Q_DECLARE_OPERATORS_FOR_FLAGS( QgsDxfExport::Flags )
650Q_DECLARE_OPERATORS_FOR_FLAGS( QgsDxfExport::DxfPolylineFlags )
651
652#endif // QGSDXFEXPORT_H
The Qgis class provides global constants for use throughout the application.
Definition qgis.h:54
DistanceUnit
Units of distance.
Definition qgis.h:3496
RenderUnit
Rendering size units.
Definition qgis.h:3627
FeatureSymbologyExport
Options for exporting features considering their symbology.
Definition qgis.h:3849
@ NoSymbology
Export only data.
Circular string geometry type.
Compound curve geometry type.
This class represents a coordinate reference system (CRS).
Class for doing transforms between two map coordinate systems.
Curve polygon geometry type.
Abstract base class for curved geometry type.
Definition qgscurve.h:36
Exports QGIS layers to the DXF format.
void setForce2d(bool force2d)
Force 2d output (eg.
ExportResult
The result of an export as dxf operation.
Qgis::FeatureSymbologyExport symbologyExport() const
Gets symbology export mode.
bool layerTitleAsName()
Retrieve whether layer title (where set) instead of name shall be use.
QgsRectangle extent() const
Gets extent of area to export.
Flag
Export flags.
HAlign
Horizontal alignments.
bool force2d()
Retrieve whether the output should be forced to 2d.
void setExtent(const QgsRectangle &r)
Set extent of area to export.
double symbologyScale() const
Returns the reference scale for output.
VAlign
Vertical alignments.
void setSymbologyExport(Qgis::FeatureSymbologyExport e)
Set symbology export mode.
DxfPolylineFlag
Flags for polylines.
void setLayerTitleAsName(bool layerTitleAsName)
Enable use of title (where set) instead of layer name, when attribute index of corresponding layer in...
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:56
Abstract base class that can be used to intercept rendered labels from a labeling / rendering job.
Line string geometry type, with support for z-dimension and m-values.
Base class for all map layer types.
Definition qgsmaplayer.h:74
The QgsMapSettings class contains configuration for rendering of the map.
Struct for storing maximum and minimum scales for measurements in map units.
Contains settings for how a map layer will be labeled.
A class to represent a 2D point.
Definition qgspointxy.h:59
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:49
A rectangle specified with double values.
Contains information about the context of a rendering operation.
Abstract base class for all rendered symbols.
Definition qgssymbol.h:94
Represents a vector layer which manages a vector based data sets.
LabelPosition is a candidate feature label position.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
#define SIP_SKIP
Definition qgis_sip.h:126
#define SIP_PYNAME(name)
Definition qgis_sip.h:81
QVector< QgsPointSequence > QgsRingSequence
QVector< QgsPoint > QgsPointSequence
#define DXF_HANDSEED
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsTextRendererUtils::CurvedTextFlags)
const QgsCoordinateReferenceSystem & crs
Holds information about each layer in a DXF job.
Layers and optional attribute index to split into multiple layers using attribute value as layer name...
QgsVectorLayer * layer() const
Returns the layer.
DxfLayer(QgsVectorLayer *vl, int layerOutputAttributeIndex=-1)
int layerOutputAttributeIndex() const
Returns the attribute index used to split into multiple layers.