62#define strcasecmp( a, b ) stricmp( a, b )
74 mMapSettings = settings;
90 mLayerNameAttribute.clear();
92 mLayerList.reserve( layers.size() );
93 for (
const DxfLayer &dxfLayer : layers )
95 mLayerList << dxfLayer.layer();
96 if ( dxfLayer.layerOutputAttributeIndex() >= 0 )
97 mLayerNameAttribute.insert( dxfLayer.layer()->id(), dxfLayer.layerOutputAttributeIndex() );
129 if ( !mForce2d && p.
is3D() && std::isfinite( p.
z() ) )
136 int minDist = std::numeric_limits<int>::max();
138 for (
int i = 1; i < static_cast< int >(
sizeof( sDxfColors ) /
sizeof( *sDxfColors ) ) && minDist > 0; ++i )
140 int dist = color_distance( color.rgba(), i );
141 if ( dist >= minDist )
148 if ( minDist == 0 && minDistAt != 7 )
152 if ( color.alpha() == 255 )
156 int c = ( color.red() & 0xff ) * 0x10000 + ( color.green() & 0xff ) * 0x100 + ( color.blue() & 0xff );
158 if ( transparencyCode != -1 && color.alpha() < 255 )
159 writeGroup( transparencyCode, 0x2000000 | color.alpha() );
164 mTextStream << QStringLiteral(
"%1\n" ).arg( code, 3, 10, QChar(
' ' ) );
169 mTextStream << QStringLiteral(
"%1\n" ).arg( i, 6, 10, QChar(
' ' ) );
175 if ( !s.contains(
'.' ) )
176 s += QLatin1String(
".0" );
177 mTextStream << s <<
'\n';
182 mTextStream << s <<
'\n';
192 if ( !d->isOpen() && !d->open( QIODevice::WriteOnly | QIODevice::Truncate ) )
197 mTextStream.setDevice( d );
198#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
199 mTextStream.setCodec( encoding.toLocal8Bit() );
201 mTextStream.setEncoding( QStringConverter::encodingForName( encoding.toLocal8Bit() ).value_or( QStringConverter::Utf8 ) );
210 for (
QgsMapLayer *ml : std::as_const( mLayerList ) )
244 QList<QgsMapLayer *> layers;
245 QStringList skippedLayers;
246 for (
QgsMapLayer *ml : std::as_const( mLayerList ) )
269 skippedLayers << ml->name();
287 if ( !skippedLayers.isEmpty() )
289 mFeedbackMessage = QObject::tr(
"The following empty layers were skipped: %1" ).arg( skippedLayers.join( QStringLiteral(
", " ) ) );
300void QgsDxfExport::writeHeader(
const QString &codepage )
302 writeGroup( 999, QStringLiteral(
"DXF created from QGIS" ) );
308 writeGroup( 9, QStringLiteral(
"$ACADVER" ) );
320 writeGroup( 9, QStringLiteral(
"$LTSCALE" ) );
332 writeGroup( 9, QStringLiteral(
"$PSLTSCALE" ) );
335 writeGroup( 9, QStringLiteral(
"$HANDSEED" ) );
338 writeGroup( 9, QStringLiteral(
"$DWGCODEPAGE" ) );
347 handle = mNextHandleId++;
349 Q_ASSERT_X( handle <
DXF_HANDMAX,
"QgsDxfExport::writeHandle(int, int)",
"DXF handle too large" );
351 writeGroup( code, QString::number( handle, 16 ) );
355void QgsDxfExport::writeTables()
362 QList< QPair< QgsSymbolLayer *, QgsSymbol * > > slList;
363 switch ( mSymbologyExport )
368 slList = symbolLayers( context );
381 writeGroup( 100, QStringLiteral(
"AcDbSymbolTable" ) );
384 writeDefaultLinetypes();
387 for (
const auto &symbolLayer : std::as_const( slList ) )
389 writeSymbolLayerLinetype( symbolLayer.first );
396 writeGroup( 2, QStringLiteral(
"BLOCK_RECORD" ) );
399 writeGroup( 100, QStringLiteral(
"AcDbSymbolTable" ) );
402 const QStringList blockStrings = QStringList() << QStringLiteral(
"*Model_Space" ) << QStringLiteral(
"*Paper_Space" ) << QStringLiteral(
"*Paper_Space0" );
403 for (
const QString &block : blockStrings )
405 writeGroup( 0, QStringLiteral(
"BLOCK_RECORD" ) );
407 writeGroup( 100, QStringLiteral(
"AcDbSymbolTableRecord" ) );
408 writeGroup( 100, QStringLiteral(
"AcDbBlockTableRecord" ) );
413 for (
const auto &symbolLayer : std::as_const( slList ) )
419 if ( hasBlockBreakingDataDefinedProperties( ml, symbolLayer.second ) )
422 QString name = QStringLiteral(
"symbolLayer%1" ).arg( i++ );
423 writeGroup( 0, QStringLiteral(
"BLOCK_RECORD" ) );
425 writeGroup( 100, QStringLiteral(
"AcDbSymbolTableRecord" ) );
426 writeGroup( 100, QStringLiteral(
"AcDbBlockTableRecord" ) );
436 writeGroup( 100, QStringLiteral(
"AcDbSymbolTable" ) );
440 writeGroup( 100, QStringLiteral(
"AcDbSymbolTableRecord" ) );
441 writeGroup( 100, QStringLiteral(
"AcDbRegAppTableRecord" ) );
450 writeGroup( 100, QStringLiteral(
"AcDbSymbolTable" ) );
458 writeGroup( 100, QStringLiteral(
"AcDbSymbolTable" ) );
466 writeGroup( 100, QStringLiteral(
"AcDbSymbolTable" ) );
470 writeGroup( 100, QStringLiteral(
"AcDbSymbolTableRecord" ) );
471 writeGroup( 100, QStringLiteral(
"AcDbViewportTableRecord" ) );
510 writeGroup( 2, QStringLiteral(
"DIMSTYLE" ) );
512 writeGroup( 100, QStringLiteral(
"AcDbSymbolTable" ) );
513 writeGroup( 100, QStringLiteral(
"AcDbDimStyleTable" ) );
517 QSet<QString> layerNames;
518 const QList< QgsMapLayer * > layers = mMapSettings.
layers();
521 if ( !layerIsScaleBasedVisible( ml ) )
528 int attrIdx = mLayerNameAttribute.value( vl->
id(), -1 );
535 const QSet<QVariant> values = vl->
uniqueValues( attrIdx );
536 for (
const QVariant &v : values )
548 writeGroup( 100, QStringLiteral(
"AcDbSymbolTable" ) );
553 writeGroup( 100, QStringLiteral(
"AcDbSymbolTableRecord" ) );
554 writeGroup( 100, QStringLiteral(
"AcDbLayerTableRecord" ) );
558 writeGroup( 6, QStringLiteral(
"CONTINUOUS" ) );
561 for (
const QString &
layerName : std::as_const( layerNames ) )
565 writeGroup( 100, QStringLiteral(
"AcDbSymbolTableRecord" ) );
566 writeGroup( 100, QStringLiteral(
"AcDbLayerTableRecord" ) );
570 writeGroup( 6, QStringLiteral(
"CONTINUOUS" ) );
579 writeGroup( 100, QStringLiteral(
"AcDbSymbolTable" ) );
585 writeGroup( 100, QStringLiteral(
"AcDbSymbolTableRecord" ) );
586 writeGroup( 100, QStringLiteral(
"AcDbTextStyleTableRecord" ) );
587 writeGroup( 2, QStringLiteral(
"STANDARD" ) );
594 writeGroup( 3, QStringLiteral(
"romans.shx" ) );
602void QgsDxfExport::writeBlocks()
607 static const QStringList blockStrings = QStringList() << QStringLiteral(
"*Model_Space" ) << QStringLiteral(
"*Paper_Space" ) << QStringLiteral(
"*Paper_Space0" );
608 for (
const QString &block : blockStrings )
612 writeGroup( 330, QString::number( mBlockHandles[ block ], 16 ) );
613 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
615 writeGroup( 100, QStringLiteral(
"AcDbBlockBegin" ) );
623 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
625 writeGroup( 100, QStringLiteral(
"AcDbBlockEnd" ) );
631 QList< QPair< QgsSymbolLayer *, QgsSymbol * > > slList;
632 switch ( mSymbologyExport )
637 slList = symbolLayers( ct );
644 for (
const auto &symbolLayer : std::as_const( slList ) )
654 if ( hasBlockBreakingDataDefinedProperties( ml, symbolLayer.second ) )
659 QString block( QStringLiteral(
"symbolLayer%1" ).arg( mBlockCounter++ ) );
660 mBlockHandle = QString::number( mBlockHandles[ block ], 16 );
665 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
667 writeGroup( 100, QStringLiteral(
"AcDbBlockBegin" ) );
680 ml->
writeDxf( *
this,
mapUnitScaleFactor( mSymbologyScale, ml->
sizeUnit(), mMapUnits, ctx.renderContext().mapToPixel().mapUnitsPerPixel() ), QStringLiteral(
"0" ), ctx );
684 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
686 writeGroup( 100, QStringLiteral(
"AcDbBlockEnd" ) );
688 mPointSymbolBlocks.insert( ml, block );
689 mPointSymbolBlockSizes.insert( ml, ml->
dxfSize( *
this, ctx ) );
690 mPointSymbolBlockAngles.insert( ml, ml->
dxfAngle( ctx ) );
696void QgsDxfExport::writeEntities()
699 writeGroup( 2, QStringLiteral(
"ENTITIES" ) );
701 mBlockHandle = QString::number( mBlockHandles[ QStringLiteral(
"*Model_Space" )], 16 );
710 job->renderer->usingSymbolLevels() )
712 writeEntitiesSymbolLevels( job );
730 QString lName(
dxfLayerName( job->splitLayerAttribute.isNull() ? job->layerTitle : fet.attribute( job->splitLayerAttribute ).toString() ) );
732 sctx.setFeature( &fet );
734 if ( !job->renderer->willRenderFeature( fet, mRenderContext ) )
739 addFeature( sctx, ct, lName,
nullptr,
nullptr );
743 const QgsSymbolList symbolList = job->renderer->symbolsForFeature( fet, mRenderContext );
744 bool hasSymbology = symbolList.size() > 0;
756 bool isGeometryGenerator = ( symbolLayer->layerType() == QLatin1String(
"GeometryGenerator" ) );
757 if ( isGeometryGenerator )
759 addGeometryGeneratorSymbolLayer( sctx, ct, lName, symbolLayer,
true );
763 addFeature( sctx, ct, lName, symbolLayer, symbol );
768 else if ( hasSymbology )
779 addGeometryGeneratorSymbolLayer( sctx, ct, lName, s->
symbolLayer( 0 ),
false );
783 addFeature( sctx, ct, lName, s->
symbolLayer( 0 ), s );
787 if ( job->labelProvider )
789 job->labelProvider->registerFeature( fet, mRenderContext );
794 else if ( job->ruleBasedLabelProvider )
796 job->ruleBasedLabelProvider->registerFeature( fet, mRenderContext );
805 QImage image( 10, 10, QImage::Format_ARGB32_Premultiplied );
806 image.setDotsPerMeterX( 96 / 25.4 * 1000 );
807 image.setDotsPerMeterY( 96 / 25.4 * 1000 );
808 QPainter painter( &image );
816void QgsDxfExport::prepareRenderers()
818 Q_ASSERT( mJobs.empty() );
828 std::floor( mMapSettings.
extent().
width() * mFactor ),
829 std::floor( mMapSettings.
extent().
height() * mFactor ), 0 ) );
835 mLabelingEngine = std::make_unique<QgsDefaultLabelingEngine>();
836 mLabelingEngine->setMapSettings( mMapSettings );
839 const QList< QgsMapLayer * > layers = mMapSettings.
layers();
849 if ( !layerIsScaleBasedVisible( vl ) )
852 QString splitLayerAttribute;
853 int splitLayerAttributeIndex = mLayerNameAttribute.value( vl->
id(), -1 );
855 if ( splitLayerAttributeIndex >= 0 && splitLayerAttributeIndex < fields.
size() )
856 splitLayerAttribute = fields.
at( splitLayerAttributeIndex ).
name();
862void QgsDxfExport::writeEntitiesSymbolLevels(
DxfLayerJob *job )
864 QHash< QgsSymbol *, QList<QgsFeature> > features;
882 QgsDebugError( QStringLiteral(
"QgsDxfExport::writeEntitiesSymbolLevels(): extent reprojection failed" ) );
894 featureSymbol = job->
renderer->symbolForFeature( fet, ctx );
895 if ( !featureSymbol )
900 QHash< QgsSymbol *, QList<QgsFeature> >::iterator it = features.find( featureSymbol );
901 if ( it == features.end() )
903 it = features.insert( featureSymbol, QList<QgsFeature>() );
905 it.value().append( fet );
913 for (
int j = 0; j < symbol->symbolLayerCount(); j++ )
915 int level = symbol->symbolLayer( j )->renderingPass();
916 if ( level < 0 || level >= 1000 )
919 while ( level >= levels.count() )
921 levels[level].append( item );
930 QHash< QgsSymbol *, QList<QgsFeature> >::iterator levelIt = features.find( item.symbol() );
931 if ( levelIt == features.end() )
936 int llayer = item.layer();
937 const QList<QgsFeature> &featureList = levelIt.value();
938 for (
const QgsFeature &feature : featureList )
940 sctx.setFeature( &feature );
941 addFeature( sctx, ct, job->
layerName, levelIt.key()->symbolLayer( llayer ), levelIt.key() );
947void QgsDxfExport::stopRenderers()
953void QgsDxfExport::writeEndFile()
960void QgsDxfExport::startSection()
965void QgsDxfExport::endSection()
990 QHash< const QgsSymbolLayer *, QString >::const_iterator blockIt = mPointSymbolBlocks.constFind( symbolLayer );
991 if ( !symbolLayer || blockIt == mPointSymbolBlocks.constEnd() )
1006 const double scale = symbolLayer->
dxfSize( *
this, ctx ) / mPointSymbolBlockSizes.value( symbolLayer );
1011 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1012 writeGroup( 100, QStringLiteral(
"AcDbBlockReference" ) );
1015 writeGroup( 50, mPointSymbolBlockAngles.value( symbolLayer ) - angle );
1016 if ( std::isfinite( scale ) && scale != 1.0 )
1027 int n = line.size();
1030 QgsDebugError( QStringLiteral(
"writePolyline: empty line layer=%1 lineStyleName=%2" ).arg( layer, lineStyleName ) );
1036 QgsDebugError( QStringLiteral(
"writePolyline: line too short layer=%1 lineStyleName=%2" ).arg( layer, lineStyleName ) );
1040 if ( mForce2d || !line.at( 0 ).is3D() )
1042 bool polygon = line[0] == line[ line.size() - 1 ];
1046 writeGroup( 0, QStringLiteral(
"LWPOLYLINE" ) );
1049 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1050 writeGroup( 100, QStringLiteral(
"AcDbPolyline" ) );
1058 for (
int i = 0; i < n; i++ )
1063 writeGroup( 0, QStringLiteral(
"POLYLINE" ) );
1066 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1070 writeGroup( 100, QStringLiteral(
"AcDb3dPolyline" ) );
1074 for (
int i = 0; i < n; i++ )
1079 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1082 writeGroup( 100, QStringLiteral(
"AcDbVertex" ) );
1083 writeGroup( 100, QStringLiteral(
"AcDb3dPolylineVertex" ) );
1091 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1097void QgsDxfExport::appendCurve(
const QgsCurve &
c, QVector<QgsPoint> &points, QVector<double> &bulges )
1102 appendLineString( *
dynamic_cast<const QgsLineString *
>( &
c ), points, bulges );
1106 appendCircularString( *
dynamic_cast<const QgsCircularString *
>( &
c ), points, bulges );
1110 appendCompoundCurve( *
dynamic_cast<const QgsCompoundCurve *
>( &
c ), points, bulges );
1114 QgsDebugError( QStringLiteral(
"Unexpected curve type %1" ).arg(
c.wktTypeStr() ) );
1119void QgsDxfExport::appendLineString(
const QgsLineString &ls, QVector<QgsPoint> &points, QVector<double> &bulges )
1121 for (
int i = 0; i < ls.
numPoints(); i++ )
1124 if ( !points.isEmpty() && points.last() == p )
1132void QgsDxfExport::appendCircularString(
const QgsCircularString &cs, QVector<QgsPoint> &points, QVector<double> &bulges )
1134 for (
int i = 0; i < cs.
numPoints() - 2; i += 2 )
1140 if ( points.isEmpty() || points.last() != p1 )
1142 else if ( !bulges.isEmpty() )
1143 bulges.removeLast();
1145 double a = ( M_PI - ( p1 - p2 ).
angle() + ( p3 - p2 ).
angle() ) / 2.0;
1146 bulges << sin( a ) / cos( a );
1153void QgsDxfExport::appendCompoundCurve(
const QgsCompoundCurve &cc, QVector<QgsPoint> &points, QVector<double> &bulges )
1155 for (
int i = 0; i < cc.
nCurves(); i++ )
1159 appendCurve( *
c, points, bulges );
1168 QgsDebugError( QStringLiteral(
"writePolyline: empty line layer=%1 lineStyleName=%2" ).arg( layer, lineStyleName ) );
1174 QgsDebugError( QStringLiteral(
"writePolyline: line too short layer=%1 lineStyleName=%2" ).arg( layer, lineStyleName ) );
1178 QVector<QgsPoint> points;
1179 QVector<double> bulges;
1180 appendCurve( curve, points, bulges );
1182 if ( mForce2d || !curve.
is3D() )
1184 writeGroup( 0, QStringLiteral(
"LWPOLYLINE" ) );
1187 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1188 writeGroup( 100, QStringLiteral(
"AcDbPolyline" ) );
1193 QgsDxfExport::DxfPolylineFlags polylineFlags;
1203 writeGroup( 70,
static_cast<int>( polylineFlags ) );
1206 for (
int i = 0; i < points.size(); i++ )
1209 if ( bulges[i] != 0.0 )
1215 writeGroup( 0, QStringLiteral(
"POLYLINE" ) );
1218 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1222 writeGroup( 100, QStringLiteral(
"AcDb3dPolyline" ) );
1226 for (
int i = 0; i < points.size(); i++ )
1231 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1234 writeGroup( 100, QStringLiteral(
"AcDbVertex" ) );
1235 writeGroup( 100, QStringLiteral(
"AcDb3dPolylineVertex" ) );
1237 if ( bulges[i] != 0.0 )
1245 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1256 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1259 writeGroup( 100, QStringLiteral(
"AcDbHatch" ) );
1265 writeGroup( 70, hatchPattern == QLatin1String(
"SOLID" ) );
1269 for (
int i = 0; i < polygon.size(); ++i )
1276 for (
int j = 0; j < polygon[i].size(); ++j )
1295 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1298 writeGroup( 100, QStringLiteral(
"AcDbHatch" ) );
1304 writeGroup( 70, hatchPattern == QLatin1String(
"SOLID" ) );
1307 QVector<QVector<QgsPoint>> points;
1308 QVector<QVector<double>> bulges;
1311 points.reserve( ringCount + 1 );
1312 bulges.reserve( ringCount + 1 );
1314 points << QVector<QgsPoint>();
1315 bulges << QVector<double>();
1316 appendCurve( *polygon.
exteriorRing(), points.last(), bulges.last() );
1318 for (
int i = 0; i < ringCount; i++ )
1320 points << QVector<QgsPoint>();
1321 bulges << QVector<double>();
1322 appendCurve( *polygon.
interiorRing( i ), points.last(), bulges.last() );
1325 bool hasBulges =
false;
1326 for (
int i = 0; i < points.size() && !hasBulges; ++i )
1327 for (
int j = 0; j < points[i].size() && !hasBulges; ++j )
1328 hasBulges = bulges[i][j] != 0.0;
1332 for (
int i = 0; i < points.size(); ++i )
1339 for (
int j = 0; j < points[i].size(); ++j )
1363 double lblX = label->
getX();
1364 double lblY = label->
getY();
1389 switch ( offsetQuad )
1439 const QString haliString = exprVal.toString();
1440 if ( haliString.compare( QLatin1String(
"Center" ), Qt::CaseInsensitive ) == 0 )
1444 else if ( haliString.compare( QLatin1String(
"Right" ), Qt::CaseInsensitive ) == 0 )
1458 const QString valiString = exprVal.toString();
1459 if ( valiString.compare( QLatin1String(
"Bottom" ), Qt::CaseInsensitive ) != 0 )
1461 if ( valiString.compare( QLatin1String(
"Base" ), Qt::CaseInsensitive ) == 0 )
1465 else if ( valiString.compare( QLatin1String(
"Half" ), Qt::CaseInsensitive ) == 0 )
1484 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1485 writeGroup( 100, QStringLiteral(
"AcDbPoint" ) );
1496 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1499 writeGroup( 100, QStringLiteral(
"AcDbHatch" ) );
1530 writeGroup( 0, QStringLiteral(
"LWPOLYLINE" ) );
1534 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1535 writeGroup( 100, QStringLiteral(
"AcDbPolyline" ) );
1554 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1557 writeGroup( 100, QStringLiteral(
"AcDbText" ) );
1568 writeGroup( 7, QStringLiteral(
"STANDARD" ) );
1569 writeGroup( 100, QStringLiteral(
"AcDbText" ) );
1578#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
1579 if ( !mTextStream.codec()->canEncode( text ) )
1582 QgsDebugError( QStringLiteral(
"could not encode:%1" ).arg( text ) );
1589 writeGroup( 100, QStringLiteral(
"AcDbEntity" ) );
1590 writeGroup( 100, QStringLiteral(
"AcDbMText" ) );
1597 while ( t.length() > 250 )
1613 writeGroup( 7, QStringLiteral(
"STANDARD" ) );
1628 geom.transform( ct );
1637 penColor = colorFromSymbolLayer( symbolLayer, ctx );
1641 Qt::PenStyle penStyle( Qt::SolidLine );
1642 Qt::BrushStyle brushStyle( Qt::NoBrush );
1644 double offset = 0.0;
1648 width = symbolLayer->
dxfWidth( *
this, ctx );
1649 offset = symbolLayer->
dxfOffset( *
this, ctx );
1658 QString lineStyleName = QStringLiteral(
"CONTINUOUS" );
1661 lineStyleName = lineStyleFromSymbolLayer( symbolLayer );
1667 writePoint( geom.constGet()->coordinateSequence().at( 0 ).at( 0 ).at( 0 ), layer, penColor, ctx, symbolLayer, symbol, angle );
1674 for (
int i = 0; i < cs.size(); i++ )
1676 writePoint( cs.at( i ).at( 0 ).at( 0 ), layer, penColor, ctx, symbolLayer, symbol, angle );
1681 if ( penStyle != Qt::NoPen )
1684 std::unique_ptr< QgsAbstractGeometry > tempGeom;
1699 sourceGeom = tempGeom.get();
1701 sourceGeom = geom.constGet();
1707 writePolyline( *curve, layer, lineStyleName, penColor, width );
1719 writePolyline( *curve, layer, lineStyleName, penColor, width );
1736 sourceGeom = tempGeom.get();
1738 sourceGeom = geom.constGet();
1757 Q_ASSERT( polygon );
1775 if ( brushStyle != Qt::NoBrush )
1778 std::unique_ptr< QgsAbstractGeometry > tempGeom;
1786 Q_ASSERT( polygon );
1787 writePolygon( *polygon, layer, QStringLiteral(
"SOLID" ), brushColor );
1800 Q_ASSERT( polygon );
1801 writePolygon( *polygon, layer, QStringLiteral(
"SOLID" ), brushColor );
1818 return symbolLayer->
dxfColor( ctx );
1821QString QgsDxfExport::lineStyleFromSymbolLayer(
const QgsSymbolLayer *symbolLayer )
1823 QString lineStyleName = QStringLiteral(
"CONTINUOUS" );
1826 return lineStyleName;
1829 QHash< const QgsSymbolLayer *, QString >::const_iterator lineTypeIt = mLineStyles.constFind( symbolLayer );
1830 if ( lineTypeIt != mLineStyles.constEnd() )
1832 lineStyleName = lineTypeIt.value();
1833 return lineStyleName;
1837 return lineNameFromPenStyle( symbolLayer->
dxfPenStyle() );
1844 int current_distance = std::numeric_limits<int>::max();
1845 for (
int i = 1; i < static_cast< int >(
sizeof( sDxfColors ) /
sizeof( *sDxfColors ) ); ++i )
1847 int dist = color_distance( pixel, i );
1848 if ( dist < current_distance )
1850 current_distance = dist;
1859int QgsDxfExport::color_distance( QRgb p1,
int index )
1861 if ( index > 255 || index < 0 )
1866 double redDiff = qRed( p1 ) - sDxfColors[index][0];
1867 double greenDiff = qGreen( p1 ) - sDxfColors[index][1];
1868 double blueDiff = qBlue( p1 ) - sDxfColors[index][2];
1870 QgsDebugMsgLevel( QStringLiteral(
"color_distance( r:%1 g:%2 b:%3 <=> i:%4 r:%5 g:%6 b:%7 ) => %8" )
1871 .arg( qRed( p1 ) ).arg( qGreen( p1 ) ).arg( qBlue( p1 ) )
1873 .arg( mDxfColors[index][0] )
1874 .arg( mDxfColors[index][1] )
1875 .arg( mDxfColors[index][2] )
1876 .arg( redDiff * redDiff + greenDiff * greenDiff + blueDiff * blueDiff ), 2 );
1878 return redDiff * redDiff + greenDiff * greenDiff + blueDiff * blueDiff;
1881QRgb QgsDxfExport::createRgbEntry( qreal r, qreal g, qreal b )
1883 return QColor::fromRgbF( r, g, b ).rgb();
1888 return mRenderContext;
1903 return mapUnitsPerPixel;
1917 double minSizeMU = std::numeric_limits<double>::lowest();
1920 minSizeMU = scale.
minSizeMM * pixelToMMFactor * mapUnitsPerPixel;
1924 minSizeMU = std::max( minSizeMU, value );
1926 value = std::max( value, minSizeMU );
1928 double maxSizeMU = std::numeric_limits<double>::max();
1931 maxSizeMU = scale.
maxSizeMM * pixelToMMFactor * mapUnitsPerPixel;
1935 maxSizeMU = std::min( maxSizeMU, value );
1937 value = std::min( value, maxSizeMU );
1940QList< QPair< QgsSymbolLayer *, QgsSymbol * > > QgsDxfExport::symbolLayers(
QgsRenderContext &context )
1942 QList< QPair< QgsSymbolLayer *, QgsSymbol * > > symbolLayers;
1953 maxSymbolLayers = 1;
1955 for (
int i = 0; i < maxSymbolLayers; ++i )
1957 symbolLayers.append( qMakePair( symbol->
symbolLayer( i ), symbol ) );
1962 return symbolLayers;
1965void QgsDxfExport::writeDefaultLinetypes()
1968 for (
const QString <ype : { QStringLiteral(
"ByLayer" ), QStringLiteral(
"ByBlock" ), QStringLiteral(
"CONTINUOUS" ) } )
1972 writeGroup( 100, QStringLiteral(
"AcDbSymbolTableRecord" ) );
1973 writeGroup( 100, QStringLiteral(
"AcDbLinetypeTableRecord" ) );
1976 writeGroup( 3, QStringLiteral(
"Defaultstyle" ) );
1982 double das = dashSize();
1983 double dss = dashSeparatorSize();
1984 double dos = dotSize();
1986 QVector<qreal> dashVector( 2 );
1987 dashVector[0] = das;
1988 dashVector[1] = dss;
1991 QVector<qreal> dotVector( 2 );
1996 QVector<qreal> dashDotVector( 4 );
1997 dashDotVector[0] = das;
1998 dashDotVector[1] = dss;
1999 dashDotVector[2] = dos;
2000 dashDotVector[3] = dss;
2003 QVector<qreal> dashDotDotVector( 6 );
2004 dashDotDotVector[0] = das;
2005 dashDotDotVector[1] = dss;
2006 dashDotDotVector[2] = dos;
2007 dashDotDotVector[3] = dss;
2008 dashDotDotVector[4] = dos;
2009 dashDotDotVector[5] = dss;
2013void QgsDxfExport::writeSymbolLayerLinetype(
const QgsSymbolLayer *symbolLayer )
2022 if ( !customLinestyle.isEmpty() )
2024 QString name = QStringLiteral(
"symbolLayer%1" ).arg( mSymbolLayerCounter++ );
2025 writeLinetype( name, customLinestyle, unit );
2026 mLineStyles.insert( symbolLayer, name );
2030int QgsDxfExport::nLineTypes(
const QList< QPair< QgsSymbolLayer *, QgsSymbol * > > &symbolLayers )
2033 for (
const auto &symbolLayer : symbolLayers )
2047void QgsDxfExport::writeLinetype(
const QString &styleName,
const QVector<qreal> &pattern,
Qgis::RenderUnit u )
2050 for ( qreal size : pattern )
2058 writeGroup( 100, QStringLiteral(
"AcDbSymbolTableRecord" ) );
2059 writeGroup( 100, QStringLiteral(
"AcDbLinetypeTableRecord" ) );
2068 for ( qreal size : pattern )
2071 double segmentLength = ( isGap ? -size : size );
2097 geomExpr.prepare( &expressionContext );
2105 symbolExpressionContextScope->
setFeature( f );
2110 for (
int i = 0; i < nSymbolLayers; ++i )
2112 addFeature( ctx, ct, layer, symbol->
symbolLayer( i ), symbol );
2121 if ( !sl || !symbol )
2126 bool blockBreak =
false;
2133 blockBreak = !properties.isEmpty();
2139double QgsDxfExport::dashSize()
const
2141 double size = mSymbologyScale * 0.002;
2142 return sizeToMapUnits( size );
2145double QgsDxfExport::dotSize()
const
2147 double size = mSymbologyScale * 0.0006;
2148 return sizeToMapUnits( size );
2151double QgsDxfExport::dashSeparatorSize()
const
2153 double size = mSymbologyScale * 0.0006;
2154 return sizeToMapUnits( size );
2157double QgsDxfExport::sizeToMapUnits(
double s )
const
2163QString QgsDxfExport::lineNameFromPenStyle( Qt::PenStyle style )
2168 return QStringLiteral(
"DASH" );
2170 return QStringLiteral(
"DOT" );
2171 case Qt::DashDotLine:
2172 return QStringLiteral(
"DASHDOT" );
2173 case Qt::DashDotDotLine:
2174 return QStringLiteral(
"DASHDOTDOT" );
2177 return QStringLiteral(
"CONTINUOUS" );
2183 if ( name.isEmpty() )
2184 return QStringLiteral(
"0" );
2209 layerName.replace( QLatin1String(
"\r\n" ), QLatin1String(
"_" ) );
2216bool QgsDxfExport::layerIsScaleBasedVisible(
const QgsMapLayer *layer )
const
2230 for (
QgsMapLayer *ml : std::as_const( mLayerList ) )
2233 if ( vl && vl->
id() ==
id )
2235 int attrIdx = mLayerNameAttribute.value( vl->
id(), -1 );
2240 return QStringLiteral(
"0" );
2245 const QList< QByteArray > codecs = QTextCodec::availableCodecs();
2246 for (
const QByteArray &codec : codecs )
2248 if ( name != codec )
2252 for ( i = 0; i < static_cast< int >(
sizeof( DXF_ENCODINGS ) /
sizeof( *DXF_ENCODINGS ) ) && name != DXF_ENCODINGS[i][1]; ++i )
2255 if ( i ==
static_cast< int >(
sizeof( DXF_ENCODINGS ) /
sizeof( *DXF_ENCODINGS ) ) )
2258 return DXF_ENCODINGS[i][0];
2267 const QList< QByteArray > codecs = QTextCodec::availableCodecs();
2269 for (
const QByteArray &codec : codecs )
2272 for ( i = 0; i < static_cast< int >(
sizeof( DXF_ENCODINGS ) /
sizeof( *DXF_ENCODINGS ) ) && strcasecmp( codec.data(), DXF_ENCODINGS[i][1] ) != 0; ++i )
2275 if ( i <
static_cast< int >(
sizeof( DXF_ENCODINGS ) /
sizeof( *DXF_ENCODINGS ) ) )
2287 return mLayerTitleAsName && !vl->
title().isEmpty() ? vl->
title() : vl->
name();
2305 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues = lf->
dataDefinedValues();
2310 QgsDebugMsgLevel( QStringLiteral(
"PAL font definedFont: %1, Style: %2" ).arg( dFont.toString(), dFont.styleName() ), 4 );
2340 QgsPalLabeling::dataDefinedTextStyle( tmpLyr, ddValues );
2343 QgsPalLabeling::dataDefinedTextBuffer( tmpLyr, ddValues );
2346 QgsPalLabeling::dataDefinedTextFormatting( tmpLyr, ddValues );
2352 QString dxfLayer = mDxfLayerNames[layerId][fid];
2354 QString wrapchr = tmpLyr.
wrapChar.isEmpty() ? QStringLiteral(
"\n" ) : tmpLyr.
wrapChar;
2359 bool prependSymb =
false;
2377 prependSymb =
false;
2386 symb = symb + wrapchr;
2390 prependSymb =
false;
2391 symb = wrapchr + symb;
2400 txt.prepend( symb );
2410 txt.replace( QChar( QChar::LineFeed ),
' ' );
2411 txt.replace( QChar( QChar::CarriageReturn ),
' ' );
2416 txt.replace( QString( QChar( QChar::CarriageReturn ) ) + QString( QChar( QChar::LineFeed ) ), QStringLiteral(
"\\P" ) );
2417 txt.replace( QChar( QChar::CarriageReturn ), QStringLiteral(
"\\P" ) );
2418 txt = txt.replace( wrapchr, QLatin1String(
"\\P" ) );
2419 txt.replace( QLatin1String(
" " ), QLatin1String(
"\\~" ) );
2423 txt.prepend(
"\\L" ).append(
"\\l" );
2428 txt.prepend(
"\\O" ).append(
"\\o" );
2433 txt.prepend(
"\\K" ).append(
"\\k" );
2436 txt.prepend( QStringLiteral(
"\\f%1|i%2|b%3;\\H%4;" )
2438 .arg( tmpLyr.
format().
font().italic() ? 1 : 0 )
2439 .arg( tmpLyr.
format().
font().bold() ? 1 : 0 )
2440 .arg( label->
getHeight() / ( 1 + txt.count( QStringLiteral(
"\\P" ) ) ) * 0.75 ) );
2448 if ( !mDxfLayerNames.contains( layerId ) )
2449 mDxfLayerNames[ layerId ] = QMap<QgsFeatureId, QString>();
2451 mDxfLayerNames[layerId][fid] =
layerName;
2467 QString splitLayerFieldName;
2469 if ( mLayerOutputAttributeIndex >= 0 && mLayerOutputAttributeIndex < fields.
size() )
2471 splitLayerFieldName = fields.
at( mLayerOutputAttributeIndex ).
name();
2474 return splitLayerFieldName;
@ OverPoint
Arranges candidates over a point (or centroid of a polygon), or at a preset offset from the point....
@ Line
Arranges candidates parallel to a generalised line representing the feature or parallel to a polygon'...
DistanceUnit
Units of distance.
LabelQuadrantPosition
Label quadrant positions.
@ Miter
Use mitered joins.
@ FollowPlacement
Alignment follows placement of label, e.g., labels to the left of a feature will be drawn with right ...
RenderUnit
Rendering size units.
@ Millimeters
Millimeters.
@ Flat
Flat cap (in line with start/end of line)
WkbType
The WKB type describes the number of dimensions a geometry has.
@ CompoundCurve
CompoundCurve.
@ MultiPolygon
MultiPolygon.
@ MultiLineString
MultiLineString.
@ CircularString
CircularString.
@ CurvePolygon
CurvePolygon.
@ MultiSurface
MultiSurface.
@ PerFeature
Keeps the number of features and export symbology per feature.
@ PerSymbolLayer
Exports one feature per symbol layer (considering symbol levels)
@ NoSymbology
Export only data.
@ Reverse
Reverse/inverse transform (from destination to source)
Abstract base class for all geometries.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
virtual bool hasCurvedSegments() const
Returns true if the geometry contains curved segments.
Circular string geometry type.
int numPoints() const override
Returns the number of points in the curve.
QgsPoint pointN(int i) const
Returns the point at index i within the circular string.
Compound curve geometry type.
int nCurves() const
Returns the number of curves in the geometry.
const QgsCurve * curveAt(int i) const
Returns the curve at the specified index.
This class represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
Qgis::DistanceUnit mapUnits
Custom exception class for Coordinate Reference System related exceptions.
Curve polygon geometry type.
int numInteriorRings() const
Returns the number of interior rings contained with the curve polygon.
const QgsCurve * exteriorRing() const
Returns the curve polygon's exterior ring.
const QgsCurve * interiorRing(int i) const
Retrieves an interior ring from the curve polygon.
Abstract base class for curved geometry type.
QgsCoordinateSequence coordinateSequence() const override
Retrieves the sequence of geometries, rings and nodes.
virtual int numPoints() const =0
Returns the number of points in the curve.
virtual bool isClosed() const
Returns true if the curve is closed.
void writeFilledCircle(const QString &layer, const QColor &color, const QgsPoint &pt, double radius)
Write filled circle (as hatch)
ExportResult
The result of an export as dxf operation.
@ DeviceNotWritableError
Device not writable error.
@ Success
Successful export.
@ EmptyExtentError
Empty extent, no extent given and no extent could be derived from layers.
@ InvalidDeviceError
Invalid device error.
void writeCircle(const QString &layer, const QColor &color, const QgsPoint &pt, double radius, const QString &lineStyleName, double width)
Write circle (as polyline)
static double mapUnitScaleFactor(double scale, Qgis::RenderUnit symbolUnits, Qgis::DistanceUnit mapUnits, double mapUnitsPerPixel=1.0)
Returns scale factor for conversion to map units.
ExportResult writeToFile(QIODevice *d, const QString &codec)
Export to a dxf file in the given encoding.
void writeLine(const QgsPoint &pt1, const QgsPoint &pt2, const QString &layer, const QString &lineStyleName, const QColor &color, double width=-1)
Write line (as a polyline)
void writeGroup(int code, int i)
Write a tuple of group code and integer value.
QString layerName(const QString &id, const QgsFeature &f) const
Gets layer name for feature.
void setFlags(QgsDxfExport::Flags flags)
Sets the export flags.
QgsRectangle extent() const
Gets extent of area to export.
@ FlagNoMText
Export text as TEXT elements. If not set, text will be exported as MTEXT elements.
void writeInt(int i)
Write an integer value.
void writeMText(const QString &layer, const QString &text, const QgsPoint &pt, double width, double angle, const QColor &color)
Write mtext (MTEXT)
QgsDxfExport()
Constructor for QgsDxfExport.
int writeHandle(int code=5, int handle=0)
Write a tuple of group code and a handle.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination CRS, or an invalid CRS if no reprojection will be done.
HAlign
Horizontal alignments.
void setDestinationCrs(const QgsCoordinateReferenceSystem &crs)
Set destination CRS.
void addLayers(const QList< QgsDxfExport::DxfLayer > &layers)
Add layers to export.
static QString dxfLayerName(const QString &name)
Returns cleaned layer name for use in DXF.
void writeDouble(double d)
Write a floating point value.
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)
Write text (TEXT)
void writeString(const QString &s)
Write a string value.
void writePolygon(const QgsRingSequence &polygon, const QString &layer, const QString &hatchPattern, const QColor &color)
Draw dxf filled polygon (HATCH)
void drawLabel(const QString &layerId, QgsRenderContext &context, pal::LabelPosition *label, const QgsPalLayerSettings &settings) override
Add a label to the dxf output.
static QString dxfEncoding(const QString &name)
Returns DXF encoding for Qt encoding.
static int closestColorMatch(QRgb color)
Gets DXF palette index of nearest entry for given color.
void writePoint(const QString &layer, const QColor &color, const QgsPoint &pt)
Write point.
Qgis::DistanceUnit mapUnits() const
Retrieve map units.
Q_DECL_DEPRECATED void registerDxfLayer(const QString &layerId, QgsFeatureId fid, const QString &layer)
Register name of layer for feature.
QgsDxfExport::Flags flags() const
Returns the export flags.
VAlign
Vertical alignments.
void clipValueToMapUnitScale(double &value, const QgsMapUnitScale &scale, double pixelToMMFactor) const
Clips value to scale minimum/maximum.
void writePolyline(const QgsPointSequence &line, const QString &layer, const QString &lineStyleName, const QColor &color, double width=-1)
Draw dxf primitives (LWPOLYLINE)
@ ContinuousPattern
The linetype pattern is generated continuously around the vertices of this polyline.
@ Closed
This is a closed polyline (or a polygon mesh closed in the M direction)
@ Curve
Curve-fit vertices have been added.
static QStringList encodings()
Returns list of available DXF encodings.
void setMapSettings(const QgsMapSettings &settings)
Set map settings and assign layer name attributes.
void writeGroupCode(int code)
Write a group code.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the scope.
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
static QgsExpressionContextScope * mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object.
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QList< QgsExpressionContextScope * > scopes()
Returns a list of scopes contained within the stack.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
Class for parsing and evaluation of expressions (formerly called "search strings").
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
@ SymbolLevels
Rendering with symbol levels (i.e. implements symbols(), symbolForFeature())
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setLimit(long long limit)
Set the maximum number of features to request.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsFeatureRequest & setExpressionContext(const QgsExpressionContext &context)
Sets the expression context used to evaluate filter expressions.
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
bool hasGeometry() const
Returns true if the feature has an associated geometry.
QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Container of fields for a vector layer.
int size() const
Returns number of items.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
int numGeometries() const
Returns the number of geometries within the collection.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
QString geometryExpression() const
Gets the expression to generate this geometry.
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
A geometry is the spatial representation of a feature.
Does vector analysis using the geos library and handles import, export, exception handling*.
The QgsLabelFeature class describes a feature that should be used within the labeling engine.
QgsPointXY anchorPosition() const
In case of quadrand or aligned positioning, this is set to the anchor point.
QString labelText() const
Text of the label.
bool reverseDirectionSymbol() const
Returns true if direction symbols should be reversed.
DirectionSymbolPlacement directionSymbolPlacement() const
Returns the placement for direction symbols.
QString leftDirectionSymbol() const
Returns the string to use for left direction arrows.
@ SymbolLeftRight
Place direction symbols on left/right of label.
@ SymbolAbove
Place direction symbols on above label.
@ SymbolBelow
Place direction symbols on below label.
QString rightDirectionSymbol() const
Returns the string to use for right direction arrows.
bool addDirectionSymbol() const
Returns true if '<' or '>' (or custom strings set via leftDirectionSymbol and rightDirectionSymbol) w...
virtual void run(QgsRenderContext &context)=0
Runs the labeling job.
Line string geometry type, with support for z-dimension and m-values.
int numPoints() const override
Returns the number of points in the curve.
QgsPoint pointN(int i) const
Returns the specified point from inside the line string.
Base class for all map layer types.
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
QString title() const
Returns the title of the layer used by QGIS Server in GetCapabilities request.
The QgsMapSettings class contains configuration for rendering of the map.
QgsPointXY layerToMapCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from layer's CRS to output CRS
QList< QgsMapLayer * > layers(bool expandGroupLayers=false) const
Returns the list of layers which will be rendered in the map.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of layers to render in the map.
void setOutputDpi(double dpi)
Sets the dpi (dots per inch) used for conversion between real world units (e.g.
const QgsMapToPixel & mapToPixel() const
QgsRectangle extent() const
Returns geographical coordinates of the rectangle that should be rendered.
void setExtent(const QgsRectangle &rect, bool magnified=true)
Sets the coordinates of the rectangle which should be rendered.
QMap< QString, QString > layerStyleOverrides() const
Returns the map of map layer style overrides (key: layer ID, value: style name) where a different sty...
void setOutputSize(QSize size)
Sets the size of the resulting map image, in pixels.
QgsPointXY mapToLayerCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from output CRS to layer's CRS
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
void setDestinationCrs(const QgsCoordinateReferenceSystem &crs)
Sets the destination crs (coordinate reference system) for the map render.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
Perform transforms between map coordinates and device coordinates.
double mapUnitsPerPixel() const
Returns the current map units per pixel.
Struct for storing maximum and minimum scales for measurements in map units.
bool minSizeMMEnabled
Whether the minimum size in mm should be respected.
double maxScale
The maximum scale, or 0.0 if unset.
double minScale
The minimum scale, or 0.0 if unset.
double maxSizeMM
The maximum size in millimeters, or 0.0 if unset.
bool maxSizeMMEnabled
Whether the maximum size in mm should be respected.
double minSizeMM
The minimum size in millimeters, or 0.0 if unset.
Abstract base class for marker symbol layers.
double size() const
Returns the symbol size.
virtual double dxfAngle(QgsSymbolRenderContext &context) const override
Gets angle.
virtual double dxfSize(const QgsDxfExport &e, QgsSymbolRenderContext &context) const override
Gets marker size.
Qgis::RenderUnit sizeUnit() const
Returns the units for the symbol's size.
Contains settings for how a map layer will be labeled.
void setFormat(const QgsTextFormat &format)
Sets the label text formatting settings, e.g., font settings, buffer settings, etc.
QString wrapChar
Wrapping character string.
Qgis::LabelPlacement placement
Label placement mode.
bool drawLabels
Whether to draw labels for this layer.
Qgis::LabelQuadrantPosition quadOffset
Sets the quadrant in which to offset labels from feature.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the label's property collection, used for data defined overrides.
Qgis::LabelMultiLineAlignment multilineAlign
Horizontal alignment of multi-line labels.
const QgsLabelLineSettings & lineSettings() const
Returns the label line settings, which contain settings related to how the label engine places and fo...
@ Vali
Vertical alignment for data defined label position (Bottom, Base, Half, Cap, Top)
@ Hali
Horizontal alignment for data defined label position (Left, Center, Right)
const QgsTextFormat & format() const
Returns the label text formatting settings, e.g., font settings, buffer settings, etc.
Point geometry type, with support for z-dimension and m-values.
static QgsProject * instance()
Returns the QgsProject singleton instance.
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
QVariant value(int key, const QgsExpressionContext &context, const QVariant &defaultValue=QVariant()) const final
Returns the calculated value of the property with the specified key from within the collection.
QSet< int > propertyKeys() const final
Returns a list of property keys contained within the collection.
bool isActive(int key) const final
Returns true if the collection contains an active property with the specified key.
A rectangle specified with double values.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
double width() const
Returns the width of the rectangle.
double xMaximum() const
Returns the x maximum value (right side of rectangle).
double yMaximum() const
Returns the y maximum value (top side of rectangle).
QgsPointXY center() const
Returns the center point of the rectangle.
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle.
bool isEmpty() const
Returns true if the rectangle has no area.
double height() const
Returns the height of the rectangle.
Contains information about the context of a rendering operation.
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
QgsExpressionContext & expressionContext()
Gets the expression context.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
void setExtent(const QgsRectangle &extent)
When rendering a map layer, calling this method sets the "clipping" extent for the layer (in the laye...
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
void setLabelingEngine(QgsLabelingEngine *engine)
Assigns the labeling engine.
void setRendererScale(double scale)
Sets the renderer map scale.
QgsLabelingEngine * labelingEngine() const
Gets access to new labeling engine (may be nullptr).
A simple line symbol layer, which renders lines using a line in a variety of styles (e....
bool useCustomDashPattern() const
Returns true if the line uses a custom dash pattern.
virtual double dxfSize(const QgsDxfExport &e, QgsSymbolRenderContext &context) const
Gets marker size.
virtual double dxfOffset(const QgsDxfExport &e, QgsSymbolRenderContext &context) const
Gets offset.
virtual QColor dxfBrushColor(QgsSymbolRenderContext &context) const
Gets brush/fill color.
virtual Qt::PenStyle dxfPenStyle() const
Gets pen style.
virtual QColor dxfColor(QgsSymbolRenderContext &context) const
Gets color.
virtual QString layerType() const =0
Returns a string that represents this layer type.
virtual double dxfWidth(const QgsDxfExport &e, QgsSymbolRenderContext &context) const
Gets line width.
virtual double dxfAngle(QgsSymbolRenderContext &context) const
Gets angle.
virtual bool writeDxf(QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, QgsSymbolRenderContext &context, QPointF shift=QPointF(0.0, 0.0)) const
write as DXF
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides.
virtual Qt::BrushStyle dxfBrushStyle() const
Gets brush/fill style.
virtual QVector< qreal > dxfCustomDashPattern(Qgis::RenderUnit &unit) const
Gets dash pattern.
virtual bool hasDataDefinedProperties() const
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
const QgsFeature * feature() const
Returns the current feature being rendered.
QgsExpressionContextScope * expressionContextScope()
This scope is always available when a symbol of this type is being rendered.
void setFeature(const QgsFeature *f)
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
Abstract base class for all rendered symbols.
QgsSymbolRenderContext * symbolRenderContext()
Returns the symbol render context.
QgsSymbolLayer * symbolLayer(int layer)
Returns the symbol layer at the specified index.
int symbolLayerCount() const
Returns the total number of symbol layers contained in the symbol.
Container for all settings relating to text rendering.
void setFont(const QFont &font)
Sets the font used for rendering text.
QColor color() const
Returns the color that text will be rendered in.
QFont font() const
Returns the font used for rendering text.
Class that adds extra information to QgsLabelFeature for text labels.
QFont definedFont() const
Font to be used for rendering.
const QMap< QgsPalLayerSettings::Property, QVariant > & dataDefinedValues() const
Gets data-defined values.
static Q_INVOKABLE double fromUnitToUnitFactor(Qgis::DistanceUnit fromUnit, Qgis::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) override
Gets an iterator for features matching the specified request.
QgsFields fields() const
Returns the fields that will be available for features that are retrieved from this source.
Represents a vector layer which manages a vector based data sets.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
QgsFeatureRenderer * renderer()
Returns the feature renderer used for rendering the features in the layer in 2D map views.
QgsRectangle extent() const FINAL
Returns the extent of the layer.
QSet< QVariant > uniqueValues(int fieldIndex, int limit=-1) const FINAL
Calculates a list of unique values contained within an attribute in the layer.
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
QgsFeatureId featureId() const
Returns the unique ID of the feature.
QgsLabelFeature * feature()
Returns the parent feature.
LabelPosition is a candidate feature label position.
double getAlpha() const
Returns the angle to rotate text (in radians).
Quadrant getQuadrant() const
FeaturePart * getFeaturePart() const
Returns the feature corresponding to this labelposition.
double getX(int i=0) const
Returns the down-left x coordinate.
double getY(int i=0) const
Returns the down-left y coordinate.
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
Contains geos related utilities and functions.
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 Q_NOWARN_DEPRECATED_POP
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
#define Q_NOWARN_DEPRECATED_PUSH
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QVector< QgsRingSequence > QgsCoordinateSequence
QVector< QgsPointSequence > QgsRingSequence
QVector< QgsPoint > QgsPointSequence
#define DXF_HANDPLOTSTYLE
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
QList< QgsSymbolLevel > QgsSymbolLevelOrder
QList< QgsSymbolLevelItem > QgsSymbolLevel
QList< QgsSymbol * > QgsSymbolList
QList< QgsSymbolLayer * > QgsSymbolLayerList
const QgsCoordinateReferenceSystem & crs
Holds information about each layer in a DXF job.
std::unique_ptr< QgsFeatureRenderer > renderer
QgsRenderContext renderContext
QgsCoordinateReferenceSystem crs
QgsVectorLayerFeatureSource featureSource
Layers and optional attribute index to split into multiple layers using attribute value as layer name...
QString splitLayerAttribute() const
If the split layer attribute is set, the vector layer will be split into several dxf layers,...