QGIS API Documentation 3.28.14-Firenze (exported)
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 {
105 NoSymbology = 0,
107 SymbolLayerSymbology
108 };
109
111 enum Flag
112 {
113 FlagNoMText = 1 << 1,
114 };
115 Q_DECLARE_FLAGS( Flags, Flag )
116
117
122 enum class ExportResult
123 {
124 Success = 0,
125 InvalidDeviceError,
126 DeviceNotWritableError,
127 EmptyExtentError
128 };
129
133 enum class VAlign : int
134 {
135 VBaseLine = 0,
136 VBottom = 1,
137 VMiddle = 2,
138 VTop = 3,
139 Undefined = 9999
140 };
141
143 enum class HAlign : int
144 {
145 HLeft = 0,
146 HCenter = 1,
147 HRight = 2,
148 HAligned = 3,
149 HMiddle = 4,
150 HFit = 5,
151 Undefined = 9999
152 };
153
160 {
161 Closed = 1,
162 Curve = 2,
163 Spline = 4,
164 Is3DPolyline = 8,
165 Is3DPolygonMesh = 16,
166 PolygonMesh = 32,
167 PolyfaceMesh = 64,
168 ContinuousPattern = 128,
169 };
170
171 Q_DECLARE_FLAGS( DxfPolylineFlags, DxfPolylineFlag )
172
173
177
178 ~QgsDxfExport() override;
179
184 void setMapSettings( const QgsMapSettings &settings );
185
191 void setFlags( QgsDxfExport::Flags flags );
192
198 QgsDxfExport::Flags flags() const;
199
205 void addLayers( const QList< QgsDxfExport::DxfLayer > &layers );
206
213 ExportResult writeToFile( QIODevice *d, const QString &codec ); //maybe add progress dialog? other parameters (e.g. scale, dpi)?
214
221 void setSymbologyScale( double scale ) { mSymbologyScale = scale; }
222
229 double symbologyScale() const { return mSymbologyScale; }
230
235 QgsUnitTypes::DistanceUnit mapUnits() const;
236
242 void setDestinationCrs( const QgsCoordinateReferenceSystem &crs );
243
249 QgsCoordinateReferenceSystem destinationCrs() const;
250
255 void setSymbologyExport( QgsDxfExport::SymbologyExport e ) { mSymbologyExport = e; }
256
262 QgsDxfExport::SymbologyExport symbologyExport() const { return mSymbologyExport; }
263
268 void setExtent( const QgsRectangle &r ) { mExtent = r; }
269
275 QgsRectangle extent() const { return mExtent; }
276
283 void setLayerTitleAsName( bool layerTitleAsName ) { mLayerTitleAsName = layerTitleAsName; }
284
290 bool layerTitleAsName() { return mLayerTitleAsName; }
291
297 void setForce2d( bool force2d ) { mForce2d = force2d; }
298
304 bool force2d() { return mForce2d; }
305
310 static int closestColorMatch( QRgb color );
311
318 QString layerName( const QString &id, const QgsFeature &f ) const;
319
326 QString layerName( QgsVectorLayer *vl ) const;
327
334 void writeGroup( int code, int i ) SIP_PYNAME( writeGroupInt );
335
342 void writeGroup( int code, long long i ) SIP_PYNAME( writeGroupLong );
343
350 void writeGroup( int code, double d ) SIP_PYNAME( writeGroupDouble );
351
357 void writeGroup( int code, const QString &s );
358
366 void writeGroup( int code, const QgsPoint &p ) SIP_PYNAME( writeGroupPointV2 );
367
376 void writeGroup( const QColor &color, int exactMatch = 62, int rgbCode = 420, int transparencyCode = 440 );
377
382 void writeGroupCode( int code );
383
388 void writeInt( int i );
389
394 void writeDouble( double d );
395
400 void writeString( const QString &s );
401
408 int writeHandle( int code = 5, int handle = 0 );
409
420 void writePolyline( const QgsPointSequence &line, const QString &layer, const QString &lineStyleName, const QColor &color, double width = -1 ) SIP_SKIP;
421
432 void writePolyline( const QgsCurve &curve, const QString &layer, const QString &lineStyleName, const QColor &color, double width = -1 ) SIP_SKIP;
433
443 void writePolygon( const QgsRingSequence &polygon, const QString &layer, const QString &hatchPattern, const QColor &color ) SIP_SKIP;
444
454 void writePolygon( const QgsCurvePolygon &polygon, const QString &layer, const QString &hatchPattern, const QColor &color ) SIP_SKIP;
455
460 void writeLine( const QgsPoint &pt1, const QgsPoint &pt2, const QString &layer, const QString &lineStyleName, const QColor &color, double width = -1 );
461
467 void writePoint( const QString &layer, const QColor &color, const QgsPoint &pt ) SIP_PYNAME( writePointV2 );
468
474 void writeFilledCircle( const QString &layer, const QColor &color, const QgsPoint &pt, double radius ) SIP_PYNAME( writeFillCircleV2 );
475
481 void writeCircle( const QString &layer, const QColor &color, const QgsPoint &pt, double radius, const QString &lineStyleName, double width ) SIP_PYNAME( writeCircleV2 );
482
488 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 );
489
495 void writeMText( const QString &layer, const QString &text, const QgsPoint &pt, double width, double angle, const QColor &color );
496
504 static double mapUnitScaleFactor( double scale, QgsUnitTypes::RenderUnit symbolUnits, QgsUnitTypes::DistanceUnit mapUnits, double mapUnitsPerPixel = 1.0 );
505
512 void clipValueToMapUnitScale( double &value, const QgsMapUnitScale &scale, double pixelToMMFactor ) const;
513
515 static QString dxfLayerName( const QString &name );
516
518 static QString dxfEncoding( const QString &name );
519
521 static QStringList encodings();
522
528 void drawLabel( const QString &layerId, QgsRenderContext &context, pal::LabelPosition *label, const QgsPalLayerSettings &settings ) SIP_SKIP override;
529
538 Q_DECL_DEPRECATED void registerDxfLayer( const QString &layerId, QgsFeatureId fid, const QString &layer );
539
540 private:
541
542#ifdef SIP_RUN
543 QgsDxfExport( const QgsDxfExport &other );
544 QgsDxfExport &operator=( const QgsDxfExport & );
545#endif
547 QgsRectangle mExtent;
549 double mSymbologyScale = 1.0;
550 SymbologyExport mSymbologyExport = NoSymbology;
552 bool mLayerTitleAsName = false;
553
554 QTextStream mTextStream;
555
556 int mSymbolLayerCounter = 0; //internal counter
557 int mNextHandleId = DXF_HANDSEED;
558 int mBlockCounter = 0;
559
560 QHash< const QgsSymbolLayer *, QString > mLineStyles; //symbol layer name types
561 QHash< const QgsSymbolLayer *, QString > mPointSymbolBlocks; //reference to point symbol blocks
562
563 //AC1009
564 void writeHeader( const QString &codepage );
565 void prepareRenderers();
566 void writeTables();
567 void writeBlocks();
568 void writeEntities();
569 void writeEntitiesSymbolLevels( DxfLayerJob *job );
570 void stopRenderers();
571 void writeEndFile();
572
573 void startSection();
574 void endSection();
575
576 void writePoint( const QgsPoint &pt, const QString &layer, const QColor &color, QgsSymbolRenderContext &ctx, const QgsSymbolLayer *symbolLayer, const QgsSymbol *symbol, double angle );
577 void writeDefaultLinetypes();
578 void writeSymbolLayerLinetype( const QgsSymbolLayer *symbolLayer );
579 void writeLinetype( const QString &styleName, const QVector<qreal> &pattern, QgsUnitTypes::RenderUnit u );
580
584 void writeText( const QString &layer, const QString &text, pal::LabelPosition *label, const QgsPalLayerSettings &layerSettings, const QgsExpressionContext &expressionContext );
585
595 void addGeometryGeneratorSymbolLayer( QgsSymbolRenderContext &context, const QgsCoordinateTransform &ct, const QString &layer, QgsSymbolLayer *symbolLayer, bool allSymbolLayers );
596
606 void addFeature( QgsSymbolRenderContext &context, const QgsCoordinateTransform &ct, const QString &layer, const QgsSymbolLayer *symbolLayer, const QgsSymbol *symbol );
607
608 //returns dxf palette index from symbol layer color
609 static QColor colorFromSymbolLayer( const QgsSymbolLayer *symbolLayer, QgsSymbolRenderContext &ctx );
610 QString lineStyleFromSymbolLayer( const QgsSymbolLayer *symbolLayer );
611
612 //functions for dxf palette
613 static int color_distance( QRgb p1, int index );
614 static QRgb createRgbEntry( qreal r, qreal g, qreal b );
615
616 //helper functions for symbology export
617 QgsRenderContext renderContext() const;
618
619 QList< QPair< QgsSymbolLayer *, QgsSymbol * > > symbolLayers( QgsRenderContext &context );
620 static int nLineTypes( const QList< QPair< QgsSymbolLayer *, QgsSymbol *> > &symbolLayers );
621 static bool hasDataDefinedProperties( const QgsSymbolLayer *sl, const QgsSymbol *symbol );
622 double dashSize() const;
623 double dotSize() const;
624 double dashSeparatorSize() const;
625 double sizeToMapUnits( double s ) const;
626 static QString lineNameFromPenStyle( Qt::PenStyle style );
627 bool layerIsScaleBasedVisible( const QgsMapLayer *layer ) const;
628
629 QHash<QString, int> mBlockHandles;
630 QString mBlockHandle;
631
633 QMap< QString, QMap<QgsFeatureId, QString> > mDxfLayerNames;
635 QgsMapSettings mMapSettings;
636 QHash<QString, int> mLayerNameAttribute;
637 double mFactor = 1.0;
638 bool mForce2d = false;
639
640 QgsDxfExport::Flags mFlags = QgsDxfExport::Flags();
641
642 void appendCurve( const QgsCurve &c, QVector<QgsPoint> &points, QVector<double> &bulges );
643 void appendLineString( const QgsLineString &ls, QVector<QgsPoint> &points, QVector<double> &bulges );
644 void appendCircularString( const QgsCircularString &cs, QVector<QgsPoint> &points, QVector<double> &bulges );
645 void appendCompoundCurve( const QgsCompoundCurve &cc, QVector<QgsPoint> &points, QVector<double> &bulges );
646
647 QgsRenderContext mRenderContext;
648 // Internal cache for layer related information required during rendering
649 QList<DxfLayerJob *> mJobs;
650 std::unique_ptr<QgsLabelingEngine> mLabelingEngine;
651};
652
653Q_DECLARE_OPERATORS_FOR_FLAGS( QgsDxfExport::Flags )
654Q_DECLARE_OPERATORS_FOR_FLAGS( QgsDxfExport::DxfPolylineFlags )
655
656#endif // QGSDXFEXPORT_H
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.
@ FeatureSymbology
Keeps the number of features and export symbology per feature (using the first symbol level)
void setSymbologyExport(QgsDxfExport::SymbologyExport e)
Set 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.
QgsDxfExport::SymbologyExport symbologyExport() const
Gets 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:73
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:93
Helper functions for various unit types.
DistanceUnit
Units of distance.
@ DistanceMeters
Meters.
RenderUnit
Rendering size units.
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(QgsField::ConfigurationFlags) CORE_EXPORT QDataStream &operator<<(QDataStream &out
Writes the field to stream out. QGIS version compatibility is not guaranteed.
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.