30#include <QApplication>
33#include <QFontMetrics>
38#include <QTextBoundaryFinder>
98 if ( !sPropertyDefinitions()->isEmpty() )
101 const QString origin = QStringLiteral(
"labeling" );
113 "e.g. Helvetica or Helvetica [Cronyx]" ), origin )
117 "e.g. Bold Condensed or Light Italic" ), origin )
159 "<b>Ellipse</b>|<b>Circle</b>|<b>SVG</b>]" ), origin )
183 "<b>Buffer</b>|<b>Background</b>]" ), origin )
199 "<b>3</b>=Left|<b>4</b>=Over|<b>5</b>=Right|<br>"
200 "<b>6</b>=Below Left|<b>7</b>=Below|<b>8</b>=Below Right]" ), origin )
220 + QStringLiteral(
"[<b>TL</b>=Top left|<b>TSL</b>=Top, slightly left|<b>T</b>=Top middle|<br>"
221 "<b>TSR</b>=Top, slightly right|<b>TR</b>=Top right|<br>"
222 "<b>L</b>=Left|<b>R</b>=Right|<br>"
223 "<b>BL</b>=Bottom left|<b>BSL</b>=Bottom, slightly left|<b>B</b>=Bottom middle|<br>"
224 "<b>BSR</b>=Bottom, slightly right|<b>BR</b>=Bottom right|<b>O</b>=Over point]" ), origin )
228 + QStringLiteral(
"[<b>OL</b>=On line|<b>AL</b>=Above line|<b>BL</b>=Below line|<br>"
229 "<b>LO</b>=Respect line orientation]" ), origin )
238 "<b>Half</b>|<b>Cap</b>|<b>Top</b>]" ), origin )
268 initPropertyDefinitions();
277 , mDataDefinedProperties( s.mDataDefinedProperties )
312 mPolygonPlacementFlags = s.mPolygonPlacementFlags;
326 mRotationUnit = s.mRotationUnit;
347 mDataDefinedProperties = s.mDataDefinedProperties;
349 mCallout.reset( s.mCallout ? s.mCallout->clone() : nullptr );
351 mPlacementSettings = s.mPlacementSettings;
352 mLineSettings = s.mLineSettings;
353 mPointSettings = s.mPointSettings;
354 mObstacleSettings = s.mObstacleSettings;
355 mThinningSettings = s.mThinningSettings;
362 mLegendString = s.mLegendString;
364 mUnplacedVisibility = s.mUnplacedVisibility;
414 for (
const QString &name : referencedColumns )
416 attributeNames.insert( name );
480 for (
const QString &name : referencedColumns )
482 attributeNames.insert( name );
489 const auto referencedColumns = mCallout->referencedFields( context );
490 for (
const QString &name : referencedColumns )
492 attributeNames.insert( name );
501 QSet<QString> referenced;
529 referenced.unite( mCallout->referencedFields( context ) );
537 if ( mRenderStarted )
539 qWarning(
"Start render called for when a previous render was already underway!!" );
566 mCallout->startRender( context );
569 mRenderStarted =
true;
574 if ( !mRenderStarted )
576 qWarning(
"Stop render called for QgsPalLayerSettings without a startRender call!" );
582 mCallout->stopRender( context );
585 mRenderStarted =
false;
595 if ( mRenderStarted )
597 qWarning(
"stopRender was not called on QgsPalLayerSettings object!" );
608 initPropertyDefinitions();
609 return *sPropertyDefinitions();
623 return mRotationUnit;
628 mRotationUnit = angleUnit;
634 QString newValue = value;
635 if ( !value.isEmpty() && !value.contains( QLatin1String(
"~~" ) ) )
638 values << QStringLiteral(
"1" );
639 values << QStringLiteral(
"0" );
642 newValue = values.join( QLatin1String(
"~~" ) );
650 QString newPropertyName =
"labeling/dataDefined/" + sPropertyDefinitions()->value(
static_cast< int >( p ) ).name();
651 QVariant newPropertyField = layer->
customProperty( newPropertyName, QVariant() );
653 if ( !newPropertyField.isValid() )
656 QString ddString = newPropertyField.toString();
658 if ( !ddString.isEmpty() && ddString != QLatin1String(
"0~~0~~~~" ) )
662 QStringList ddv = newStyleString.split( QStringLiteral(
"~~" ) );
664 bool active = ddv.at( 0 ).toInt();
665 if ( ddv.at( 1 ).toInt() )
681void QgsPalLayerSettings::readOldDataDefinedPropertyMap(
QgsVectorLayer *layer, QDomElement *parentElem )
683 if ( !layer && !parentElem )
688 QgsPropertiesDefinition::const_iterator i = sPropertyDefinitions()->constBegin();
689 for ( ; i != sPropertyDefinitions()->constEnd(); ++i )
694 readOldDataDefinedProperty( layer,
static_cast< Property >( i.key() ) );
696 else if ( parentElem )
699 QDomElement e = parentElem->firstChildElement( i.value().name() );
702 bool active = e.attribute( QStringLiteral(
"active" ) ).compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0;
703 bool isExpression = e.attribute( QStringLiteral(
"useExpr" ) ).compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0;
717void QgsPalLayerSettings::readFromLayerCustomProperties(
QgsVectorLayer *layer )
719 if ( layer->
customProperty( QStringLiteral(
"labeling" ) ).toString() != QLatin1String(
"pal" ) )
744 QDomDocument doc( QStringLiteral(
"substitutions" ) );
745 doc.setContent( layer->
customProperty( QStringLiteral(
"labeling/substitutions" ) ).toString() );
746 QDomElement replacementElem = doc.firstChildElement( QStringLiteral(
"substitutions" ) );
772 if ( predefinedPositionOrder.isEmpty() )
773 predefinedPositionOrder = *DEFAULT_PLACEMENT_ORDER();
779 if ( layer->
customProperty( QStringLiteral(
"labeling/distMapUnitScale" ) ).toString().isEmpty() )
782 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/distMapUnitMinScale" ), 0.0 ).toDouble();
784 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/distMapUnitMaxScale" ), 0.0 ).toDouble();
795 if ( layer->
customProperty( QStringLiteral(
"labeling/labelOffsetInMapUnits" ), QVariant(
true ) ).toBool() )
800 if ( layer->
customProperty( QStringLiteral(
"labeling/labelOffsetMapUnitScale" ) ).toString().isEmpty() )
803 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/labelOffsetMapUnitMinScale" ), 0.0 ).toDouble();
805 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/labelOffsetMapUnitMaxScale" ), 0.0 ).toDouble();
813 QVariant tempAngle = layer->
customProperty( QStringLiteral(
"labeling/angleOffset" ), QVariant() );
814 if ( tempAngle.isValid() )
816 double oldAngle = layer->
customProperty( QStringLiteral(
"labeling/angleOffset" ), QVariant( 0.0 ) ).toDouble();
830 switch ( layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceUnit" ), QVariant( 1 ) ).toUInt() )
845 if ( layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceMapUnitScale" ) ).toString().isEmpty() )
848 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceMapUnitMinScale" ), 0.0 ).toDouble();
850 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceMapUnitMaxScale" ), 0.0 ).toDouble();
859 double scalemn = layer->
customProperty( QStringLiteral(
"labeling/scaleMin" ), QVariant( 0 ) ).toDouble();
860 double scalemx = layer->
customProperty( QStringLiteral(
"labeling/scaleMax" ), QVariant( 0 ) ).toDouble();
863 QVariant scalevis = layer->
customProperty( QStringLiteral(
"labeling/scaleVisibility" ), QVariant() );
864 if ( scalevis.isValid() )
870 else if ( scalemn > 0 || scalemx > 0 )
886 if ( layer->
customProperty( QStringLiteral(
"labeling/displayAll" ), QVariant(
false ) ).toBool() )
904 mObstacleSettings.
setFactor( layer->
customProperty( QStringLiteral(
"labeling/obstacleFactor" ), QVariant( 1.0 ) ).toDouble() );
906 zIndex = layer->
customProperty( QStringLiteral(
"labeling/zIndex" ), QVariant( 0.0 ) ).toDouble();
908 mDataDefinedProperties.
clear();
909 if ( layer->
customProperty( QStringLiteral(
"labeling/ddProperties" ) ).isValid() )
911 QDomDocument doc( QStringLiteral(
"dd" ) );
912 doc.setContent( layer->
customProperty( QStringLiteral(
"labeling/ddProperties" ) ).toString() );
913 QDomElement elem = doc.firstChildElement( QStringLiteral(
"properties" ) );
914 mDataDefinedProperties.
readXml( elem, *sPropertyDefinitions() );
919 readOldDataDefinedPropertyMap( layer,
nullptr );
963 QDomElement textStyleElem = elem.firstChildElement( QStringLiteral(
"text-style" ) );
964 fieldName = textStyleElem.attribute( QStringLiteral(
"fieldName" ) );
965 isExpression = textStyleElem.attribute( QStringLiteral(
"isExpression" ) ).toInt();
967 mFormat.
readXml( elem, context );
969 previewBkgrdColor = QColor( textStyleElem.attribute( QStringLiteral(
"previewBkgrdColor" ), QStringLiteral(
"#ffffff" ) ) );
972 useSubstitutions = textStyleElem.attribute( QStringLiteral(
"useSubstitutions" ) ).toInt();
973 mLegendString = textStyleElem.attribute( QStringLiteral(
"legendString" ), QObject::tr(
"Aa" ) );
976 QDomElement textFormatElem = elem.firstChildElement( QStringLiteral(
"text-format" ) );
977 wrapChar = textFormatElem.attribute( QStringLiteral(
"wrapChar" ) );
978 autoWrapLength = textFormatElem.attribute( QStringLiteral(
"autoWrapLength" ), QStringLiteral(
"0" ) ).toInt();
979 useMaxLineLengthForAutoWrap = textFormatElem.attribute( QStringLiteral(
"useMaxLineLengthForAutoWrap" ), QStringLiteral(
"1" ) ).toInt();
981 mLineSettings.
setAddDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"addDirectionSymbol" ) ).toInt() );
982 mLineSettings.
setLeftDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"leftDirectionSymbol" ), QStringLiteral(
"<" ) ) );
983 mLineSettings.
setRightDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"rightDirectionSymbol" ), QStringLiteral(
">" ) ) );
984 mLineSettings.
setReverseDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"reverseDirectionSymbol" ) ).toInt() );
986 formatNumbers = textFormatElem.attribute( QStringLiteral(
"formatNumbers" ) ).toInt();
987 decimals = textFormatElem.attribute( QStringLiteral(
"decimals" ) ).toInt();
988 plusSign = textFormatElem.attribute( QStringLiteral(
"plussign" ) ).toInt();
991 QDomElement placementElem = elem.firstChildElement( QStringLiteral(
"placement" ) );
996 centroidWhole = placementElem.attribute( QStringLiteral(
"centroidWhole" ), QStringLiteral(
"0" ) ).toInt();
997 centroidInside = placementElem.attribute( QStringLiteral(
"centroidInside" ), QStringLiteral(
"0" ) ).toInt();
1000 if ( predefinedPositionOrder.isEmpty() )
1001 predefinedPositionOrder = *DEFAULT_PLACEMENT_ORDER();
1004 fitInPolygonOnly = placementElem.attribute( QStringLiteral(
"fitInPolygonOnly" ), QStringLiteral(
"0" ) ).toInt();
1005 dist = placementElem.attribute( QStringLiteral(
"dist" ) ).toDouble();
1006 if ( !placementElem.hasAttribute( QStringLiteral(
"distUnits" ) ) )
1008 if ( placementElem.attribute( QStringLiteral(
"distInMapUnits" ) ).toInt() )
1017 if ( !placementElem.hasAttribute( QStringLiteral(
"distMapUnitScale" ) ) )
1020 double oldMin = placementElem.attribute( QStringLiteral(
"distMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
1022 double oldMax = placementElem.attribute( QStringLiteral(
"distMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
1031 xOffset = placementElem.attribute( QStringLiteral(
"xOffset" ), QStringLiteral(
"0" ) ).toDouble();
1032 yOffset = placementElem.attribute( QStringLiteral(
"yOffset" ), QStringLiteral(
"0" ) ).toDouble();
1033 if ( !placementElem.hasAttribute( QStringLiteral(
"offsetUnits" ) ) )
1041 if ( !placementElem.hasAttribute( QStringLiteral(
"labelOffsetMapUnitScale" ) ) )
1044 double oldMin = placementElem.attribute( QStringLiteral(
"labelOffsetMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
1046 double oldMax = placementElem.attribute( QStringLiteral(
"labelOffsetMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
1054 if ( placementElem.hasAttribute( QStringLiteral(
"angleOffset" ) ) )
1056 double oldAngle = placementElem.attribute( QStringLiteral(
"angleOffset" ), QStringLiteral(
"0" ) ).toDouble();
1061 angleOffset = placementElem.attribute( QStringLiteral(
"rotationAngle" ), QStringLiteral(
"0" ) ).toDouble();
1064 preserveRotation = placementElem.attribute( QStringLiteral(
"preserveRotation" ), QStringLiteral(
"1" ) ).toInt();
1067 if ( rotationUnitString.startsWith( QLatin1String(
"Angle" ) ) )
1070 rotationUnitString = rotationUnitString.mid( 5 );
1075 maxCurvedCharAngleIn = placementElem.attribute( QStringLiteral(
"maxCurvedCharAngleIn" ), QStringLiteral(
"25" ) ).toDouble();
1076 maxCurvedCharAngleOut = placementElem.attribute( QStringLiteral(
"maxCurvedCharAngleOut" ), QStringLiteral(
"-25" ) ).toDouble();
1077 priority = placementElem.attribute( QStringLiteral(
"priority" ) ).toInt();
1078 repeatDistance = placementElem.attribute( QStringLiteral(
"repeatDistance" ), QStringLiteral(
"0" ) ).toDouble();
1079 if ( !placementElem.hasAttribute( QStringLiteral(
"repeatDistanceUnits" ) ) )
1082 switch ( placementElem.attribute( QStringLiteral(
"repeatDistanceUnit" ), QString::number( 1 ) ).toUInt() )
1102 if ( !placementElem.hasAttribute( QStringLiteral(
"repeatDistanceMapUnitScale" ) ) )
1105 double oldMin = placementElem.attribute( QStringLiteral(
"repeatDistanceMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
1107 double oldMax = placementElem.attribute( QStringLiteral(
"repeatDistanceMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
1115 mLineSettings.
setOverrunDistance( placementElem.attribute( QStringLiteral(
"overrunDistance" ), QStringLiteral(
"0" ) ).toDouble() );
1118 mLineSettings.
setLineAnchorPercent( placementElem.attribute( QStringLiteral(
"lineAnchorPercent" ), QStringLiteral(
"0.5" ) ).toDouble() );
1124 mPointSettings.
setMaximumDistance( placementElem.attribute( QStringLiteral(
"maximumDistance" ), QStringLiteral(
"0" ) ).toDouble() );
1128 geometryGenerator = placementElem.attribute( QStringLiteral(
"geometryGenerator" ) );
1131 QString geometryTypeKey = placementElem.attribute( QStringLiteral(
"geometryGeneratorType" ) );
1133 if ( geometryTypeKey.endsWith( QLatin1String(
"Geometry" ) ) )
1134 geometryTypeKey.chop( 8 );
1139 QString layerTypeKey = placementElem.attribute( QStringLiteral(
"layerType" ) );
1141 if ( layerTypeKey.endsWith( QLatin1String(
"Geometry" ) ) )
1142 layerTypeKey.chop( 8 );
1147 mPlacementSettings.
setAllowDegradedPlacement( placementElem.attribute( QStringLiteral(
"allowDegraded" ), QStringLiteral(
"0" ) ).toInt() );
1150 QDomElement renderingElem = elem.firstChildElement( QStringLiteral(
"rendering" ) );
1152 drawLabels = renderingElem.attribute( QStringLiteral(
"drawLabels" ), QStringLiteral(
"1" ) ).toInt();
1154 maximumScale = renderingElem.attribute( QStringLiteral(
"scaleMin" ), QStringLiteral(
"0" ) ).toDouble();
1155 minimumScale = renderingElem.attribute( QStringLiteral(
"scaleMax" ), QStringLiteral(
"0" ) ).toDouble();
1156 scaleVisibility = renderingElem.attribute( QStringLiteral(
"scaleVisibility" ) ).toInt();
1158 fontLimitPixelSize = renderingElem.attribute( QStringLiteral(
"fontLimitPixelSize" ), QStringLiteral(
"0" ) ).toInt();
1159 fontMinPixelSize = renderingElem.attribute( QStringLiteral(
"fontMinPixelSize" ), QStringLiteral(
"0" ) ).toInt();
1160 fontMaxPixelSize = renderingElem.attribute( QStringLiteral(
"fontMaxPixelSize" ), QStringLiteral(
"10000" ) ).toInt();
1162 if ( placementElem.hasAttribute( QStringLiteral(
"overlapHandling" ) ) )
1169 if ( renderingElem.attribute( QStringLiteral(
"displayAll" ), QStringLiteral(
"0" ) ).toInt() )
1185 labelPerPart = renderingElem.attribute( QStringLiteral(
"labelPerPart" ) ).toInt();
1186 mLineSettings.
setMergeLines( renderingElem.attribute( QStringLiteral(
"mergeLines" ) ).toInt() );
1187 mThinningSettings.
setMinimumFeatureSize( renderingElem.attribute( QStringLiteral(
"minFeatureSize" ) ).toDouble() );
1188 mThinningSettings.
setLimitNumberLabelsEnabled( renderingElem.attribute( QStringLiteral(
"limitNumLabels" ), QStringLiteral(
"0" ) ).toInt() );
1189 mThinningSettings.
setMaximumNumberLabels( renderingElem.attribute( QStringLiteral(
"maxNumLabels" ), QStringLiteral(
"2000" ) ).toInt() );
1190 mObstacleSettings.
setIsObstacle( renderingElem.attribute( QStringLiteral(
"obstacle" ), QStringLiteral(
"1" ) ).toInt() );
1191 mObstacleSettings.
setFactor( renderingElem.attribute( QStringLiteral(
"obstacleFactor" ), QStringLiteral(
"1" ) ).toDouble() );
1193 zIndex = renderingElem.attribute( QStringLiteral(
"zIndex" ), QStringLiteral(
"0.0" ) ).toDouble();
1196 QDomElement ddElem = elem.firstChildElement( QStringLiteral(
"dd_properties" ) );
1197 if ( !ddElem.isNull() )
1199 mDataDefinedProperties.
readXml( ddElem, *sPropertyDefinitions() );
1204 mDataDefinedProperties.
clear();
1205 QDomElement ddElem = elem.firstChildElement( QStringLiteral(
"data-defined" ) );
1206 readOldDataDefinedPropertyMap(
nullptr, &ddElem );
1247 const QString calloutType = elem.attribute( QStringLiteral(
"calloutType" ) );
1248 if ( calloutType.isEmpty() )
1260 QDomElement textStyleElem = mFormat.
writeXml( doc, context );
1263 textStyleElem.setAttribute( QStringLiteral(
"fieldName" ),
fieldName );
1264 textStyleElem.setAttribute( QStringLiteral(
"isExpression" ),
isExpression );
1265 QDomElement replacementElem = doc.createElement( QStringLiteral(
"substitutions" ) );
1267 textStyleElem.appendChild( replacementElem );
1268 textStyleElem.setAttribute( QStringLiteral(
"useSubstitutions" ),
useSubstitutions );
1269 textStyleElem.setAttribute( QStringLiteral(
"legendString" ), mLegendString );
1272 QDomElement textFormatElem = doc.createElement( QStringLiteral(
"text-format" ) );
1273 textFormatElem.setAttribute( QStringLiteral(
"wrapChar" ),
wrapChar );
1274 textFormatElem.setAttribute( QStringLiteral(
"autoWrapLength" ),
autoWrapLength );
1276 textFormatElem.setAttribute( QStringLiteral(
"multilineAlign" ),
static_cast< unsigned int >(
multilineAlign ) );
1277 textFormatElem.setAttribute( QStringLiteral(
"addDirectionSymbol" ), mLineSettings.
addDirectionSymbol() );
1278 textFormatElem.setAttribute( QStringLiteral(
"leftDirectionSymbol" ), mLineSettings.
leftDirectionSymbol() );
1279 textFormatElem.setAttribute( QStringLiteral(
"rightDirectionSymbol" ), mLineSettings.
rightDirectionSymbol() );
1280 textFormatElem.setAttribute( QStringLiteral(
"reverseDirectionSymbol" ), mLineSettings.
reverseDirectionSymbol() );
1281 textFormatElem.setAttribute( QStringLiteral(
"placeDirectionSymbol" ),
static_cast< unsigned int >( mLineSettings.
directionSymbolPlacement() ) );
1282 textFormatElem.setAttribute( QStringLiteral(
"formatNumbers" ),
formatNumbers );
1283 textFormatElem.setAttribute( QStringLiteral(
"decimals" ),
decimals );
1284 textFormatElem.setAttribute( QStringLiteral(
"plussign" ),
plusSign );
1287 QDomElement placementElem = doc.createElement( QStringLiteral(
"placement" ) );
1288 placementElem.setAttribute( QStringLiteral(
"placement" ),
static_cast< int >(
placement ) );
1289 placementElem.setAttribute( QStringLiteral(
"polygonPlacementFlags" ),
static_cast< int >( mPolygonPlacementFlags ) );
1290 placementElem.setAttribute( QStringLiteral(
"placementFlags" ),
static_cast< unsigned int >( mLineSettings.
placementFlags() ) );
1291 placementElem.setAttribute( QStringLiteral(
"centroidWhole" ),
centroidWhole );
1292 placementElem.setAttribute( QStringLiteral(
"centroidInside" ),
centroidInside );
1294 placementElem.setAttribute( QStringLiteral(
"fitInPolygonOnly" ),
fitInPolygonOnly );
1295 placementElem.setAttribute( QStringLiteral(
"dist" ),
dist );
1298 placementElem.setAttribute( QStringLiteral(
"offsetType" ),
static_cast< unsigned int >(
offsetType ) );
1299 placementElem.setAttribute( QStringLiteral(
"quadOffset" ),
static_cast< unsigned int >( mPointSettings.
quadrant() ) );
1300 placementElem.setAttribute( QStringLiteral(
"xOffset" ),
xOffset );
1301 placementElem.setAttribute( QStringLiteral(
"yOffset" ),
yOffset );
1304 placementElem.setAttribute( QStringLiteral(
"rotationAngle" ),
angleOffset );
1305 placementElem.setAttribute( QStringLiteral(
"preserveRotation" ),
preserveRotation );
1308 const QString rotationUnitString = QStringLiteral(
"Angle" ) +
qgsEnumValueToKey( mRotationUnit );
1309 placementElem.setAttribute( QStringLiteral(
"rotationUnit" ), rotationUnitString );
1313 placementElem.setAttribute( QStringLiteral(
"priority" ),
priority );
1314 placementElem.setAttribute( QStringLiteral(
"repeatDistance" ),
repeatDistance );
1317 placementElem.setAttribute( QStringLiteral(
"overrunDistance" ), mLineSettings.
overrunDistance() );
1320 placementElem.setAttribute( QStringLiteral(
"lineAnchorPercent" ), mLineSettings.
lineAnchorPercent() );
1321 placementElem.setAttribute( QStringLiteral(
"lineAnchorType" ),
static_cast< int >( mLineSettings.
anchorType() ) );
1322 placementElem.setAttribute( QStringLiteral(
"lineAnchorClipping" ),
static_cast< int >( mLineSettings.
anchorClipping() ) );
1325 placementElem.setAttribute( QStringLiteral(
"maximumDistance" ), mPointSettings.
maximumDistance() );
1329 placementElem.setAttribute( QStringLiteral(
"geometryGenerator" ),
geometryGenerator );
1337 placementElem.setAttribute( QStringLiteral(
"allowDegraded" ), mPlacementSettings.
allowDegradedPlacement() ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
1340 QDomElement renderingElem = doc.createElement( QStringLiteral(
"rendering" ) );
1341 renderingElem.setAttribute( QStringLiteral(
"drawLabels" ),
drawLabels );
1342 renderingElem.setAttribute( QStringLiteral(
"scaleVisibility" ),
scaleVisibility );
1343 renderingElem.setAttribute( QStringLiteral(
"scaleMin" ),
maximumScale );
1344 renderingElem.setAttribute( QStringLiteral(
"scaleMax" ),
minimumScale );
1345 renderingElem.setAttribute( QStringLiteral(
"fontLimitPixelSize" ),
fontLimitPixelSize );
1346 renderingElem.setAttribute( QStringLiteral(
"fontMinPixelSize" ),
fontMinPixelSize );
1347 renderingElem.setAttribute( QStringLiteral(
"fontMaxPixelSize" ),
fontMaxPixelSize );
1348 renderingElem.setAttribute( QStringLiteral(
"upsidedownLabels" ),
static_cast< unsigned int >(
upsidedownLabels ) );
1350 renderingElem.setAttribute( QStringLiteral(
"labelPerPart" ),
labelPerPart );
1351 renderingElem.setAttribute( QStringLiteral(
"mergeLines" ), mLineSettings.
mergeLines() );
1352 renderingElem.setAttribute( QStringLiteral(
"minFeatureSize" ), mThinningSettings.
minimumFeatureSize() );
1354 renderingElem.setAttribute( QStringLiteral(
"maxNumLabels" ), mThinningSettings.
maximumNumberLabels() );
1355 renderingElem.setAttribute( QStringLiteral(
"obstacle" ), mObstacleSettings.
isObstacle() );
1356 renderingElem.setAttribute( QStringLiteral(
"obstacleFactor" ), mObstacleSettings.
factor() );
1357 renderingElem.setAttribute( QStringLiteral(
"obstacleType" ),
static_cast< unsigned int >( mObstacleSettings.
type() ) );
1358 renderingElem.setAttribute( QStringLiteral(
"zIndex" ),
zIndex );
1359 renderingElem.setAttribute( QStringLiteral(
"unplacedVisibility" ),
static_cast< int >( mUnplacedVisibility ) );
1361 QDomElement ddElem = doc.createElement( QStringLiteral(
"dd_properties" ) );
1362 mDataDefinedProperties.
writeXml( ddElem, *sPropertyDefinitions() );
1364 QDomElement elem = doc.createElement( QStringLiteral(
"settings" ) );
1365 elem.appendChild( textStyleElem );
1366 elem.appendChild( textFormatElem );
1367 elem.appendChild( placementElem );
1368 elem.appendChild( renderingElem );
1369 elem.appendChild( ddElem );
1373 elem.setAttribute( QStringLiteral(
"calloutType" ), mCallout->type() );
1374 mCallout->saveProperties( doc, elem, context );
1391 QPixmap pixmap( size * devicePixelRatio );
1392 pixmap.fill( Qt::transparent );
1393 pixmap.setDevicePixelRatio( devicePixelRatio );
1395 painter.begin( &pixmap );
1397 painter.setRenderHint( QPainter::Antialiasing );
1399 const QRectF rect( 0, 0, size.width(), size.height() );
1402 painter.setPen( Qt::NoPen );
1404 if ( ( background1.lightnessF() < 0.7 ) )
1406 background1 = background1.darker( 125 );
1410 background1 = background1.lighter( 125 );
1413 QLinearGradient linearGrad( QPointF( 0, 0 ), QPointF( 0, rect.height() ) );
1414 linearGrad.setColorAt( 0, background1 );
1415 linearGrad.setColorAt( 1, background2 );
1416 painter.setBrush( QBrush( linearGrad ) );
1417 if ( size.width() > 30 )
1419 painter.drawRoundedRect( rect, 6, 6 );
1424 painter.drawRect( rect );
1426 painter.setBrush( Qt::NoBrush );
1427 painter.setPen( Qt::NoPen );
1442 QWidget *activeWindow = QApplication::activeWindow();
1443 if ( QScreen *screen = activeWindow ? activeWindow->screen() : nullptr )
1463 ? fontSize * tempFormat.
buffer().
size() / 100
1468 double ytrans = 0.0;
1471 ? fontSize * tempFormat.
buffer().
size() / 100
1476 const QStringList text = QStringList() << ( previewText.isEmpty() ? settings.
legendString() : previewText );
1478 QRectF textRect = rect;
1479 textRect.setLeft( xtrans + padding );
1480 textRect.setWidth( rect.width() - xtrans - 2 * padding );
1482 if ( textRect.width() > 2000 )
1483 textRect.setWidth( 2000 - 2 * padding );
1485 const double bottom = textRect.height() / 2 + textHeight / 2;
1486 textRect.setTop( bottom - textHeight );
1487 textRect.setBottom( bottom );
1498 QRectF labelRect( textRect.left() + ( textRect.width() - textWidth ) / 2.0, textRect.top(), textWidth, textRect.height() );
1505 if ( size.width() > 30 )
1510 rect.width() - iconWidth * 3, rect.height() - iconWidth * 3,
1511 iconWidth * 2, iconWidth * 2 ), Qt::AlignRight | Qt::AlignBottom );
1515 painter.setBrush( Qt::NoBrush );
1517 if ( size.width() > 30 )
1519 painter.drawRoundedRect( rect, 6, 6 );
1524 painter.drawRect( rect );
1533 return mUnplacedVisibility;
1538 mUnplacedVisibility = visibility;
1543 return QgsPalLabeling::checkMinimumSizeMM(
ct, geom, minSize );
1555 QString textCopy( text );
1558 std::unique_ptr< QgsRenderContext > scopedRc;
1563 scopedRc->expressionContext().setFeature( *f );
1679 if ( wrapchr.isEmpty() )
1681 wrapchr = QStringLiteral(
"\n" );
1686 && ( !leftDirSymb.isEmpty() || !rightDirSymb.isEmpty() ) )
1688 QString dirSym = leftDirSymb;
1690 if ( fm->horizontalAdvance( rightDirSymb ) > fm->horizontalAdvance( dirSym ) )
1691 dirSym = rightDirSymb;
1693 switch ( placeDirSymb )
1696 textCopy.append( dirSym );
1701 textCopy.prepend( dirSym + QStringLiteral(
"\n" ) );
1706 double w = 0.0, h = 0.0, rw = 0.0, rh = 0.0;
1707 double labelHeight = fm->ascent() + fm->descent();
1710 const int lines = multiLineSplit.size();
1714 switch ( orientation )
1720 for (
const QString &line : std::as_const( multiLineSplit ) )
1722 w = std::max( w, fm->horizontalAdvance( line ) );
1729 double letterSpacing = mFormat.
scaledFont( *context ).letterSpacing();
1730 double labelWidth = fm->maxWidth();
1733 int maxLineLength = 0;
1734 for (
const QString &line : std::as_const( multiLineSplit ) )
1736 maxLineLength = std::max( maxLineLength,
static_cast<int>( line.length() ) );
1738 h = fm->ascent() * maxLineLength + ( maxLineLength - 1 ) * letterSpacing;
1744 double widthHorizontal = 0.0;
1745 for (
const QString &line : std::as_const( multiLineSplit ) )
1747 widthHorizontal = std::max( w, fm->horizontalAdvance( line ) );
1750 double widthVertical = 0.0;
1751 double letterSpacing = mFormat.
scaledFont( *context ).letterSpacing();
1752 double labelWidth = fm->maxWidth();
1755 double heightHorizontal = 0.0;
1758 double heightVertical = 0.0;
1759 int maxLineLength = 0;
1760 for (
const QString &line : std::as_const( multiLineSplit ) )
1762 maxLineLength = std::max( maxLineLength,
static_cast<int>( line.length() ) );
1764 heightVertical = fm->ascent() * maxLineLength + ( maxLineLength - 1 ) * letterSpacing;
1766 w = widthHorizontal;
1767 rw = heightVertical;
1768 h = heightHorizontal;
1777 if ( rotatedLabelX && rotatedLabelY )
1779 *rotatedLabelX = rw * uPP;
1780 *rotatedLabelY = rh * uPP;
1844 if ( wrapchr.isEmpty() )
1846 wrapchr = QStringLiteral(
"\n" );
1852 QSizeF maximumExtraSpaceAllowance( 0, 0 );
1853 QSizeF minimumSize( 0, 0 );
1855 && ( !leftDirSymb.isEmpty() || !rightDirSymb.isEmpty() ) )
1859 const QString dirSym = fm.horizontalAdvance( rightDirSymb ) > fm.horizontalAdvance( leftDirSymb )
1860 ? rightDirSymb : leftDirSymb;
1862 switch ( placeDirSymb )
1865 maximumExtraSpaceAllowance = QSizeF( fm.horizontalAdvance( dirSym ), 0 );
1871 minimumSize = QSizeF( fm.horizontalAdvance( dirSym ), 0 );
1887 w = std::max( minimumSize.width(), size.width() + maximumExtraSpaceAllowance.width() );
1888 h = std::max( minimumSize.height(), size.height() + maximumExtraSpaceAllowance.height() );
1893 rh = std::max( minimumSize.width(), rotatedSize.width() + maximumExtraSpaceAllowance.width() );
1894 rw = std::max( minimumSize.height(), rotatedSize.height() + maximumExtraSpaceAllowance.height() );
1906 w = fm.horizontalAdvance( text );
1910 size = QSizeF( w * uPP, h * uPP );
1911 rotatedSize = QSizeF( rw * uPP, rh * uPP );
1913 if ( documentMetrics )
1919 outerBounds = QRectF( outerBoundsPixels.left() * uPP,
1920 outerBoundsPixels.top() * uPP,
1921 outerBoundsPixels.width() * uPP,
1922 outerBoundsPixels.height() * uPP );
1937 bool isObstacle = mObstacleSettings.
isObstacle();
1945 return registerObstacleFeature( f, context, obstacleGeometry );
1960 if ( obstacleGeometry.
isNull() )
1973 dataDefinedValues.clear();
1990 if ( useScaleVisibility )
2003 maxScale = 1 / std::fabs( maxScale );
2023 minScale = 1 / std::fabs( minScale );
2035 QFont labelFont = evaluatedFormat.
font();
2043 QString units = exprVal.toString();
2044 if ( !units.isEmpty() )
2054 double fontSize = evaluatedFormat.
size();
2060 if ( fontSize <= 0.0 )
2067 if ( fontPixelSize < 1 )
2071 labelFont.setPixelSize( fontPixelSize );
2083 if ( fontMinPixel > labelFont.pixelSize() || labelFont.pixelSize() > fontMaxPixel )
2095 labelFont.setCapitalization( QFont::MixedCase );
2097 parseTextStyle( labelFont, fontunits, context );
2100 parseTextFormatting( context );
2101 parseTextBuffer( context );
2102 parseTextMask( context );
2103 parseShapeBackground( context );
2104 parseDropShadow( context );
2109 QList<QgsTextFormat::Tab> tabPositions;
2113 for (
const QVariant &part : parts )
2122 for (
const QString &part : parts )
2135 evaluatedFormat.
setFont( labelFont );
2139 evaluatedFormat.
setSize( labelFont.pixelSize() / symbologyReferenceScaleFactor );
2188 QString fcase = exprVal.toString().trimmed();
2189 QgsDebugMsgLevel( QStringLiteral(
"exprVal FontCase:%1" ).arg( fcase ), 4 );
2191 if ( !fcase.isEmpty() )
2193 if ( fcase.compare( QLatin1String(
"NoChange" ), Qt::CaseInsensitive ) == 0 )
2197 else if ( fcase.compare( QLatin1String(
"Upper" ), Qt::CaseInsensitive ) == 0 )
2201 else if ( fcase.compare( QLatin1String(
"Lower" ), Qt::CaseInsensitive ) == 0 )
2205 else if ( fcase.compare( QLatin1String(
"Capitalize" ), Qt::CaseInsensitive ) == 0 )
2209 else if ( fcase.compare( QLatin1String(
"Title" ), Qt::CaseInsensitive ) == 0 )
2213#if defined(HAS_KDE_QT5_SMALL_CAPS_FIX) || QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)
2214 else if ( fcase.compare( QLatin1String(
"SmallCaps" ), Qt::CaseInsensitive ) == 0 )
2218 else if ( fcase.compare( QLatin1String(
"AllSmallCaps" ), Qt::CaseInsensitive ) == 0 )
2234 if ( evalFormatNumbers )
2238 if ( decimalPlaces <= 0 )
2244 QVariant textV( labelText );
2246 double d = textV.toDouble( &ok );
2249 QString numberFormat;
2250 if ( d > 0 && signPlus )
2252 numberFormat.append(
'+' );
2254 numberFormat.append(
"%1" );
2255 labelText = numberFormat.arg( QLocale().toString( d,
'f', decimalPlaces ) );
2260 const QFontMetricsF labelFontMetrics( labelFont );
2277 calculateLabelSize( labelFontMetrics, labelText, context, evaluatedFormat, &doc, &documentMetrics, labelSize, rotatedSize, outerBounds );
2281 calculateLabelSize( labelFontMetrics, labelText, context, evaluatedFormat,
nullptr,
nullptr, labelSize, rotatedSize, outerBounds );
2296 calculateLabelSize( labelFontMetrics, labelText, context, evaluatedFormat, &doc, &documentMetrics, labelSize, rotatedSize, outerBounds );
2303 double maxcharanglein = 20.0;
2304 double maxcharangleout = -20.0;
2322 maxcharanglein = std::clamp(
static_cast< double >( maxcharanglePt.x() ), 20.0, 60.0 );
2323 maxcharangleout = std::clamp(
static_cast< double >( maxcharanglePt.y() ), 20.0, 95.0 );
2327 maxcharangleout = -( std::fabs( maxcharangleout ) );
2348 QString str = exprVal.toString().trimmed();
2349 QgsDebugMsgLevel( QStringLiteral(
"exprVal CentroidWhole:%1" ).arg( str ), 4 );
2351 if ( !str.isEmpty() )
2353 if ( str.compare( QLatin1String(
"Visible" ), Qt::CaseInsensitive ) == 0 )
2355 wholeCentroid =
false;
2357 else if ( str.compare( QLatin1String(
"Whole" ), Qt::CaseInsensitive ) == 0 )
2359 wholeCentroid =
true;
2373 std::unique_ptr<QgsGeometry> scopedClonedGeom;
2379 geom = simplifier.
simplify( geom );
2396 bool doClip =
false;
2397 if ( !centroidPoly || !wholeCentroid )
2409 if ( dataDefinedOutside.userType() == QMetaType::Type::QString )
2411 const QString value = dataDefinedOutside.toString().trimmed();
2412 if ( value.compare( QLatin1String(
"force" ), Qt::CaseInsensitive ) == 0 )
2418 else if ( value.compare( QLatin1String(
"yes" ), Qt::CaseInsensitive ) == 0 )
2423 else if ( value.compare( QLatin1String(
"no" ), Qt::CaseInsensitive ) == 0 )
2431 if ( dataDefinedOutside.toBool() )
2470 permissibleZone = geom;
2485 geos::unique_ptr geos_geom_clone;
2506 double minimumSize = 0.0;
2516 if ( !checkMinimumSizeMM( context, geom, featureThinningSettings.
minimumFeatureSize() ) )
2521 if ( !geos_geom_clone )
2550 bool layerDefinedRotation =
false;
2551 bool dataDefinedRotation =
false;
2552 double xPos = 0.0, yPos = 0.0;
2553 double angleInRadians = 0.0;
2554 double quadOffsetX = 0.0, quadOffsetY = 0.0;
2555 double offsetX = 0.0, offsetY = 0.0;
2567 bool ddFixedQuad =
false;
2576 int quadInt = exprVal.toInt( &ok );
2577 if ( ok && 0 <= quadInt && quadInt <= 8 )
2647 QString units = exprVal.toString().trimmed();
2648 if ( !units.isEmpty() )
2654 offUnit = decodedUnits;
2669 layerDefinedRotation =
true;
2670 angleInRadians = ( 360 -
angleOffset ) * M_PI / 180;
2682 const double rotation = exprVal.toDouble( &ok );
2685 dataDefinedRotation =
true;
2693 angleInRadians = ( 360 - rotationDegrees ) * M_PI / 180.0;
2698 bool hasDataDefinedPosition =
false;
2700 bool ddPosition =
false;
2712 bool ddXPos =
false, ddYPos =
false;
2713 xPos = xPosProperty.toDouble( &ddXPos );
2714 yPos = yPosProperty.toDouble( &ddYPos );
2715 if ( ddXPos && ddYPos )
2716 hasDataDefinedPosition =
true;
2727 if ( pointPosProperty.userType() == qMetaTypeId<QgsReferencedGeometry>() )
2732 if ( !referencedGeometryPoint.
isNull()
2736 else if ( pointPosProperty.userType() == qMetaTypeId< QgsGeometry>() )
2743 hasDataDefinedPosition =
true;
2754 if ( hasDataDefinedPosition )
2757 if ( layerDefinedRotation && !dataDefinedRotation )
2759 angleInRadians = 0.0;
2768 QString haliString = exprVal.toString();
2769 if ( haliString.compare( QLatin1String(
"Center" ), Qt::CaseInsensitive ) == 0 )
2771 xdiff -= labelSize.width() / 2.0;
2773 else if ( haliString.compare( QLatin1String(
"Right" ), Qt::CaseInsensitive ) == 0 )
2775 xdiff -= labelSize.width();
2786 QString valiString = exprVal.toString();
2787 if ( valiString.compare( QLatin1String(
"Bottom" ), Qt::CaseInsensitive ) != 0 )
2789 if ( valiString.compare( QLatin1String(
"Top" ), Qt::CaseInsensitive ) == 0 )
2791 ydiff -= labelSize.height();
2795 double descentRatio = labelFontMetrics.descent() / labelFontMetrics.height();
2796 if ( valiString.compare( QLatin1String(
"Base" ), Qt::CaseInsensitive ) == 0 )
2798 ydiff -= labelSize.height() * descentRatio;
2802 double capHeightRatio = ( labelFontMetrics.boundingRect(
'H' ).height() + 1 + labelFontMetrics.descent() ) / labelFontMetrics.height();
2803 ydiff -= labelSize.height() * capHeightRatio;
2804 if ( valiString.compare( QLatin1String(
"Half" ), Qt::CaseInsensitive ) == 0 )
2806 ydiff += labelSize.height() * ( capHeightRatio - descentRatio ) / 2.0;
2814 if ( dataDefinedRotation )
2817 double xd = xdiff * std::cos( angleInRadians ) - ydiff * std::sin( angleInRadians );
2818 double yd = xdiff * std::sin( angleInRadians ) + ydiff * std::cos( angleInRadians );
2828 if (
const QgsPoint *point = qgsgeometry_cast< const QgsPoint * >( ddPoint.
constGet() ) )
2836 QgsMessageLog::logMessage( QObject::tr(
"Invalid data defined label position (%1, %2)" ).arg( xPos ).arg( yPos ), QObject::tr(
"Labeling" ) );
2837 hasDataDefinedPosition =
false;
2856 bool alwaysShow =
false;
2878 QString units = exprVal.toString().trimmed();
2879 if ( !units.isEmpty() )
2885 repeatUnits = decodedUnits;
2911 bool labelAll =
labelPerPart && !hasDataDefinedPosition;
2912 if ( !hasDataDefinedPosition )
2929 auto labelFeature = std::make_unique< QgsTextLabelFeature>( feature.
id(), std::move( geos_geom_clone ), labelSize );
2930 labelFeature->setAnchorPosition( anchorPosition );
2931 labelFeature->setFeature( feature );
2932 labelFeature->setSymbol( symbol );
2933 labelFeature->setDocument( doc, documentMetrics );
2935 labelFeature->setRotatedSize( rotatedSize );
2938 labelFeature->setHasFixedPosition( hasDataDefinedPosition );
2939 labelFeature->setFixedPosition(
QgsPointXY( xPos, yPos ) );
2941 labelFeature->setHasFixedAngle( dataDefinedRotation || ( !hasDataDefinedPosition && !
qgsDoubleNear( angleInRadians, 0.0 ) ) );
2942 labelFeature->setFixedAngle( angleInRadians );
2943 labelFeature->setQuadOffset( QPointF( quadOffsetX, quadOffsetY ) );
2944 labelFeature->setPositionOffset(
QgsPointXY( offsetX, offsetY ) );
2946 labelFeature->setAlwaysShow( alwaysShow );
2947 labelFeature->setRepeatDistance( repeatDist );
2948 labelFeature->setLabelText( labelText );
2949 labelFeature->setPermissibleZone( permissibleZone );
2950 labelFeature->setOverrunDistance( overrunDistanceEval );
2951 labelFeature->setOverrunSmoothDistance( overrunSmoothDist );
2952 labelFeature->setMaximumDistance( maximumDistanceEval );
2956 labelFeature->setLabelAllParts( labelAll );
2958 labelFeature->setMinimumSize( minimumSize );
2962 labelFeature->setSymbolSize( QSizeF( obstacleGeometry.
boundingBox().
width(),
2966 if ( outerBounds.left() != 0 || outerBounds.top() != 0 || !
qgsDoubleNear( outerBounds.width(), labelSize.width() ) || !
qgsDoubleNear( outerBounds.height(), labelSize.height() ) )
2968 labelFeature->setOuterBounds( outerBounds );
2973 double topMargin = std::max( 0.25 * labelFontMetrics.ascent(), 0.0 );
2974 double bottomMargin = 1.0 + labelFontMetrics.descent();
2975 QgsMargins vm( 0.0, topMargin, 0.0, bottomMargin );
2977 labelFeature->setVisualMargin( vm );
2980 QgsDebugMsgLevel( QStringLiteral(
"PAL font stored definedFont: %1, Style: %2" ).arg( labelFont.toString(), labelFont.styleName() ), 4 );
2981 labelFeature->setDefinedFont( labelFont );
2983 labelFeature->setMaximumCharacterAngleInside( std::clamp( maxcharanglein, 20.0, 60.0 ) * M_PI / 180 );
2984 labelFeature->setMaximumCharacterAngleOutside( std::clamp( maxcharangleout, -95.0, -20.0 ) * M_PI / 180 );
3008 double distance =
dist;
3022 QString units = exprVal.toString().trimmed();
3023 QgsDebugMsgLevel( QStringLiteral(
"exprVal DistanceUnits:%1" ).arg( units ), 4 );
3024 if ( !units.isEmpty() )
3030 distUnit = decodedUnits;
3044 distance = ( distance < 0 ? -1 : 1 ) * std::max( std::fabs( distance ), 1.0 );
3056 distance = std::max( distance, 2.0 );
3061 distance = std::max( distance, 2.0 );
3068 labelFeature->setDistLabel( d );
3073 labelFeature->setHasFixedQuadrant(
true );
3078 labelFeature->setPolygonPlacementFlags( polygonPlacement );
3087 labelFeature->setZIndex( z );
3097 double priorityD = exprVal.toDouble( &ok );
3100 priorityD = std::clamp( priorityD, 0.0, 10.0 );
3101 priorityD = 1 - priorityD / 10.0;
3102 labelFeature->setPriority( priorityD );
3115 labelFeature->setAllowDegradedPlacement( allowDegradedPlacement );
3124 const QString cleanedString = handlingString.trimmed();
3125 if ( cleanedString.compare( QLatin1String(
"prevent" ), Qt::CaseInsensitive ) == 0 )
3127 else if ( cleanedString.compare( QLatin1String(
"allowifneeded" ), Qt::CaseInsensitive ) == 0 )
3129 else if ( cleanedString.compare( QLatin1String(
"alwaysallow" ), Qt::CaseInsensitive ) == 0 )
3132 labelFeature->setOverlapHandling( overlapHandling );
3135 labelFeature->setPrioritization( mPlacementSettings.
prioritization() );
3141 labelFeature->setObstacleSettings( os );
3144 if ( positionOrder.isEmpty() )
3145 positionOrder = *DEFAULT_PLACEMENT_ORDER();
3151 if ( !dataDefinedOrder.isEmpty() )
3156 labelFeature->setPredefinedPositionOrder( positionOrder );
3159 labelFeature->setDataDefinedValues( dataDefinedValues );
3161 return labelFeature;
3169 if ( !obstacleGeometry.
isNull() )
3171 geom = obstacleGeometry;
3186 if ( ls->numPoints() < 2 )
3192 std::unique_ptr<QgsGeometry> scopedClonedGeom;
3198 geom = simplifier.
simplify( geom );
3201 geos::unique_ptr geos_geom_clone;
3202 std::unique_ptr<QgsGeometry> scopedPreparedGeom;
3210 if ( !geos_geom_clone )
3214 auto obstacleFeature = std::make_unique< QgsLabelFeature >( f.
id(), std::move( geos_geom_clone ), QSizeF( 0, 0 ) );
3215 obstacleFeature->setFeature( f );
3220 obstacleFeature->setObstacleSettings( os );
3223 return obstacleFeature;
3226bool QgsPalLayerSettings::dataDefinedValEval( DataDefinedValueType valType,
3230 if ( !mDataDefinedProperties.
isActive( p ) )
3234 exprVal = mDataDefinedProperties.
value( p, context );
3241 bool bol = exprVal.toBool();
3242 dataDefinedValues.insert( p, QVariant( bol ) );
3248 int size = exprVal.toInt( &ok );
3252 dataDefinedValues.insert( p, QVariant( size ) );
3260 int size = exprVal.toInt( &ok );
3262 if ( ok && size > 0 )
3264 dataDefinedValues.insert( p, QVariant( size ) );
3272 double size = exprVal.toDouble( &ok );
3276 dataDefinedValues.insert( p, QVariant( size ) );
3284 double size = exprVal.toDouble( &ok );
3286 if ( ok && size > 0.0 )
3288 dataDefinedValues.insert( p, QVariant( size ) );
3296 double rot = exprVal.toDouble( &ok );
3299 if ( rot < -180.0 && rot >= -360 )
3303 if ( rot > 180.0 && rot <= 360 )
3307 if ( rot >= -180 && rot <= 180 )
3309 dataDefinedValues.insert( p, QVariant( rot ) );
3318 int size = exprVal.toInt( &ok );
3319 if ( ok && size >= 0 && size <= 100 )
3321 dataDefinedValues.insert( p, QVariant( size ) );
3328 QString str = exprVal.toString();
3330 dataDefinedValues.insert( p, QVariant( str ) );
3335 QString unitstr = exprVal.toString().trimmed();
3337 if ( !unitstr.isEmpty() )
3346 QString colorstr = exprVal.toString().trimmed();
3349 if ( color.isValid() )
3351 dataDefinedValues.insert( p, QVariant( color ) );
3358 QString joinstr = exprVal.toString().trimmed();
3360 if ( !joinstr.isEmpty() )
3369 QString blendstr = exprVal.toString().trimmed();
3371 if ( !blendstr.isEmpty() )
3384 dataDefinedValues.insert( p, res );
3395 dataDefinedValues.insert( p, res );
3405void QgsPalLayerSettings::parseTextStyle( QFont &labelFont,
3418 QString ddFontFamily;
3425 QString family = exprVal.toString().trimmed();
3426 QgsDebugMsgLevel( QStringLiteral(
"exprVal Font family:%1" ).arg( family ), 4 );
3429 if ( labelFont.family() != family )
3435 ddFontFamily = family;
3442 QString ddFontStyle;
3448 QString fontstyle = exprVal.toString().trimmed();
3449 QgsDebugMsgLevel( QStringLiteral(
"exprVal Font style:%1" ).arg( fontstyle ), 4 );
3450 ddFontStyle = fontstyle;
3455 bool ddBold =
false;
3463 bool ddItalic =
false;
3473 QFont appFont = QApplication::font();
3474 bool newFontBuilt =
false;
3475 if ( ddBold || ddItalic )
3479 newFontBuilt =
true;
3480 newFont.setBold( ddBold );
3481 newFont.setItalic( ddItalic );
3483 else if ( !ddFontStyle.isEmpty()
3484 && ddFontStyle.compare( QLatin1String(
"Ignore" ), Qt::CaseInsensitive ) != 0 )
3486 if ( !ddFontFamily.isEmpty() )
3490 mFontDB = std::make_unique< QFontDatabase >();
3492 QFont styledfont = mFontDB->font( ddFontFamily, ddFontStyle, appFont.pointSize() );
3493 if ( appFont != styledfont )
3495 newFont = styledfont;
3496 newFontBuilt =
true;
3503 else if ( !ddFontFamily.isEmpty() )
3505 if ( ddFontStyle.compare( QLatin1String(
"Ignore" ), Qt::CaseInsensitive ) != 0 )
3509 mFontDB = std::make_unique< QFontDatabase >();
3510 QFont styledfont = mFontDB->font( ddFontFamily, mFormat.
namedStyle(), appFont.pointSize() );
3511 if ( appFont != styledfont )
3513 newFont = styledfont;
3514 newFontBuilt =
true;
3520 newFontBuilt =
true;
3528 newFont.setPixelSize( labelFont.pixelSize() );
3529 newFont.setUnderline( labelFont.underline() );
3530 newFont.setStrikeOut( labelFont.strikeOut() );
3531 newFont.setWordSpacing( labelFont.wordSpacing() );
3532 newFont.setLetterSpacing( QFont::AbsoluteSpacing, labelFont.letterSpacing() );
3534 labelFont = newFont;
3538 double wordspace = labelFont.wordSpacing();
3547 double letterspace = labelFont.letterSpacing();
3560 labelFont.setStrikeOut( strikeout );
3575 labelFont.setUnderline( underline );
3601 drawBuffer = exprVal.toBool();
3614 double bufrSize = buffer.
size();
3617 bufrSize = exprVal.toDouble();
3621 double bufferOpacity = buffer.
opacity() * 100;
3624 bufferOpacity = exprVal.toDouble();
3627 drawBuffer = ( drawBuffer && bufrSize > 0.0 && bufferOpacity > 0 );
3657 bool maskEnabled = mask.
enabled();
3660 maskEnabled = exprVal.toBool();
3669 double bufrSize = mask.
size();
3672 bufrSize = exprVal.toDouble();
3676 double opacity = mask.
opacity() * 100;
3679 opacity = exprVal.toDouble();
3682 maskEnabled = ( maskEnabled && bufrSize > 0.0 && opacity > 0 );
3707 wrapchr = exprVal.toString();
3713 evalAutoWrapLength = exprVal.toInt();
3734 QString str = exprVal.toString().trimmed();
3735 QgsDebugMsgLevel( QStringLiteral(
"exprVal MultiLineAlignment:%1" ).arg( str ), 4 );
3737 if ( !str.isEmpty() )
3742 if ( str.compare( QLatin1String(
"Center" ), Qt::CaseInsensitive ) == 0 )
3746 else if ( str.compare( QLatin1String(
"Right" ), Qt::CaseInsensitive ) == 0 )
3750 else if ( str.compare( QLatin1String(
"Follow" ), Qt::CaseInsensitive ) == 0 )
3754 else if ( str.compare( QLatin1String(
"Justify" ), Qt::CaseInsensitive ) == 0 )
3771 QString str = exprVal.toString().trimmed();
3772 if ( !str.isEmpty() )
3781 drawDirSymb = exprVal.toBool();
3796 QString str = exprVal.toString().trimmed();
3797 QgsDebugMsgLevel( QStringLiteral(
"exprVal DirSymbPlacement:%1" ).arg( str ), 4 );
3799 if ( !str.isEmpty() )
3804 if ( str.compare( QLatin1String(
"Above" ), Qt::CaseInsensitive ) == 0 )
3808 else if ( str.compare( QLatin1String(
"Below" ), Qt::CaseInsensitive ) == 0 )
3830 bool drawShape = background.
enabled();
3833 drawShape = exprVal.toBool();
3842 double shapeOpacity = background.
opacity() * 100;
3845 shapeOpacity = 100.0 * exprVal.toDouble();
3848 drawShape = ( drawShape && shapeOpacity > 0 );
3864 QString skind = exprVal.toString().trimmed();
3865 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeKind:%1" ).arg( skind ), 4 );
3867 if ( !skind.isEmpty() )
3876 QString svgPath = background.
svgFile();
3883 QString svgfile = exprVal.toString().trimmed();
3884 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeSVGFile:%1" ).arg( svgfile ), 4 );
3899 QString stype = exprVal.toString().trimmed();
3900 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeSizeType:%1" ).arg( stype ), 4 );
3902 if ( !stype.isEmpty() )
3911 double ddShpSizeX = background.
size().width();
3914 ddShpSizeX = exprVal.toDouble();
3918 double ddShpSizeY = background.
size().height();
3921 ddShpSizeY = exprVal.toDouble();
3927 && ( svgPath.isEmpty()
3928 || ( !svgPath.isEmpty()
3930 && ddShpSizeX == 0.0 ) ) )
3938 && ddShpSizeX == 0.0 ) ) )
3945 && ( ddShpSizeX == 0.0 || ddShpSizeY == 0.0 ) )
3970 QString rotstr = exprVal.toString().trimmed();
3971 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeRotationType:%1" ).arg( rotstr ), 4 );
3973 if ( !rotstr.isEmpty() )
4024 bool drawShadow = shadow.
enabled();
4027 drawShadow = exprVal.toBool();
4036 double shadowOpacity = shadow.
opacity() * 100;
4039 shadowOpacity = exprVal.toDouble();
4046 shadowOffDist = exprVal.toDouble();
4053 shadowRad = exprVal.toDouble();
4056 drawShadow = ( drawShadow && shadowOpacity > 0 && !( shadowOffDist == 0.0 && shadowRad == 0.0 ) );
4073 QString str = exprVal.toString().trimmed();
4074 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShadowUnder:%1" ).arg( str ), 4 );
4076 if ( !str.isEmpty() )
4111 switch ( layer->
type() )
4115 const QgsVectorLayer *vl = qobject_cast< const QgsVectorLayer * >( layer );
4126 return !labeling->styles().empty();
4133 const QgsMeshLayer *ml = qobject_cast< const QgsMeshLayer * >( layer );
4139 const QgsRasterLayer *rl = qobject_cast< const QgsRasterLayer * >( layer );
4186QStringList
QgsPalLabeling::splitToLines(
const QString &text,
const QString &wrapCharacter,
const int autoWrapLength,
const bool useMaxLineLengthWhenAutoWrapping )
4188 QStringList multiLineSplit;
4189 if ( !wrapCharacter.isEmpty() && wrapCharacter != QLatin1String(
"\n" ) )
4192 const QStringList lines = text.split( wrapCharacter );
4193 for (
const QString &line : lines )
4195 multiLineSplit.append( line.split(
'\n' ) );
4200 multiLineSplit = text.split(
'\n' );
4204 if ( autoWrapLength != 0 )
4206 QStringList autoWrappedLines;
4207 autoWrappedLines.reserve( multiLineSplit.count() );
4208 for (
const QString &line : std::as_const( multiLineSplit ) )
4210 autoWrappedLines.append(
QgsStringUtils::wordWrap( line, autoWrapLength, useMaxLineLengthWhenAutoWrapping ).split(
'\n' ) );
4212 multiLineSplit = autoWrappedLines;
4214 return multiLineSplit;
4219 QStringList graphemes;
4220 QTextBoundaryFinder boundaryFinder( QTextBoundaryFinder::Grapheme, text );
4221 int currentBoundary = -1;
4222 int previousBoundary = 0;
4223 while ( ( currentBoundary = boundaryFinder.toNextBoundary() ) > 0 )
4225 graphemes << text.mid( previousBoundary, currentBoundary - previousBoundary );
4226 previousBoundary = currentBoundary;
4256 QgsDebugMsgLevel( QStringLiteral(
"Ignoring feature due to transformation exception" ), 4 );
4262 return std::isfinite( point.
x() ) && std::isfinite( point.
y() );
4266 cp->removeInvalidRings();
4268 else if (
QgsMultiSurface *ms = qgsgeometry_cast< QgsMultiSurface * >( geom.
get() ) )
4270 for (
int i = 0; i < ms->numGeometries(); ++i )
4272 if (
QgsCurvePolygon *cp = qgsgeometry_cast< QgsCurvePolygon * >( ms->geometryN( i ) ) )
4273 cp->removeInvalidRings();
4290 const bool mustClip = ( !clipGeometry.
isNull() &&
4294 bool mustClipExact =
false;
4318 QVector< QgsGeometry> parts;
4319 parts.reserve( qgsgeometry_cast< const QgsGeometryCollection * >( geom.
constGet() )->numGeometries() );
4328 parts.append( partGeom );
4336 if ( bufferGeom.
isNull() )
4345 if ( mustClipExact )
4380 double length = geom.
length();
4381 if ( length >= 0.0 )
4383 return ( length >= ( minSize * mapUnitsPerMM ) );
4388 double area = geom.
area();
4391 return ( std::sqrt( area ) >= ( minSize * mapUnitsPerMM ) );
4399 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4402 bool changed =
false;
4408 format.
setColor( ddColor.value<QColor>() );
4433 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4455 QList<QgsTextFormat::Tab> tabPositions;
4459 for (
const QVariant &part : parts )
4468 for (
const QString &part : parts )
4524 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4527 bool changed =
false;
4575 buffer.
setColor( ddColor.value<QColor>() );
4602 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4604 if ( ddValues.isEmpty() )
4608 bool changed =
false;
4668 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4671 bool changed =
false;
4711 QSizeF size = background.
size();
4718 QSizeF size = background.
size();
4819 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4822 bool changed =
false;
4881 shadow.
setColor( ddColor.value<QColor>() );
The Qgis class provides global constants for use throughout the application.
QFlags< VectorRenderingSimplificationFlag > VectorRenderingSimplificationFlags
Simplification flags for vector feature rendering.
@ Success
Operation succeeded.
AngleUnit
Units of angles.
@ NoSimplification
No simplification can be applied.
LabelOffsetType
Behavior modifier for label offset and distance, only applies in some label placement modes.
@ FromPoint
Offset distance applies from point geometry.
@ FromSymbolBounds
Offset distance applies from rendered symbol bounds.
@ PreferCloser
Prefer closer labels, falling back to alternate positions before larger distances.
LabelPlacement
Placement modes which determine how label candidates are generated for a feature.
@ OverPoint
Arranges candidates over a point (or centroid of a polygon), or at a preset offset from the point....
@ Curved
Arranges candidates following the curvature of a line feature. Applies to line layers only.
@ AroundPoint
Arranges candidates in a circle around a point (or centroid of a polygon). Applies to point or polygo...
@ Line
Arranges candidates parallel to a generalised line representing the feature or parallel to a polygon'...
@ Free
Arranges candidates scattered throughout a polygon feature. Candidates are rotated to respect the pol...
@ OrderedPositionsAroundPoint
Candidates are placed in predefined positions around a point. Preference is given to positions with g...
@ Horizontal
Arranges horizontal candidates scattered throughout a polygon feature. Applies to polygon layers only...
@ PerimeterCurved
Arranges candidates following the curvature of a polygon's boundary. Applies to polygon layers only.
@ OutsidePolygons
Candidates are placed outside of polygon boundaries. Applies to polygon layers only.
@ AllowPlacementInsideOfPolygon
Labels can be placed inside a polygon feature.
@ AllowPlacementOutsideOfPolygon
Labels can be placed outside of a polygon feature.
VectorSimplificationAlgorithm
Simplification algorithms for vector features.
@ SkipEmptyInteriorRings
Skip any empty polygon interior ring.
@ Warning
Warning message.
QFlags< LabelLinePlacementFlag > LabelLinePlacementFlags
Line placement flags, which control how candidates are generated for a linear feature.
@ Labeling
Labeling-specific layout mode.
@ Rectangle
Text within rectangle layout mode.
Capitalization
String capitalization options.
@ AllSmallCaps
Force all characters to small caps.
@ MixedCase
Mixed case, ie no change.
@ AllLowercase
Convert all characters to lowercase.
@ TitleCase
Simple title case conversion - does not fully grammatically parse the text and uses simple rules only...
@ SmallCaps
Mixed case small caps.
@ ForceFirstLetterToCapital
Convert just the first letter of each word to uppercase, leave the rest untouched.
@ AllUppercase
Convert all characters to uppercase.
QFlags< LabelPolygonPlacementFlag > LabelPolygonPlacementFlags
Polygon placement flags, which control how candidates are generated for a polygon feature.
LabelQuadrantPosition
Label quadrant positions.
TextOrientation
Text orientations.
@ Vertical
Vertically oriented text.
@ RotationBased
Horizontally or vertically oriented text based on rotation (only available for map labeling)
@ Horizontal
Horizontally oriented text.
UnplacedLabelVisibility
Unplaced label visibility.
@ FollowEngineSetting
Respect the label engine setting.
@ AffectsLabeling
If present, indicates that the renderer will participate in the map labeling problem.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
LabelMultiLineAlignment
Text alignment for multi-line labels.
@ FollowPlacement
Alignment follows placement of label, e.g., labels to the left of a feature will be drawn with right ...
@ Group
Composite group layer. Added in QGIS 3.24.
@ Plugin
Plugin based layer.
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
@ Mesh
Mesh layer. Added in QGIS 3.2.
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
RenderUnit
Rendering size units.
@ Percentage
Percentage of another measurement (e.g., canvas size, feature size)
@ Millimeters
Millimeters.
@ Points
Points (e.g., for font sizes)
@ Antialiasing
Use antialiasing while drawing.
LabelOverlapHandling
Label overlap handling.
@ AllowOverlapAtNoCost
Labels may freely overlap other labels, at no cost.
@ AllowOverlapIfRequired
Avoids overlapping labels when possible, but permit overlaps if labels for features cannot otherwise ...
@ PreventOverlap
Do not allow labels to overlap other labels.
static const double UI_SCALE_FACTOR
UI scaling factor.
@ MiddleLeft
Label on left of point.
@ TopRight
Label on top-right of point.
@ MiddleRight
Label on right of point.
@ TopSlightlyRight
Label on top of point, slightly right of center.
@ BottomRight
Label on bottom right of point.
@ BottomLeft
Label on bottom-left of point.
@ BottomSlightlyRight
Label below point, slightly right of center.
@ TopLeft
Label on top-left of point.
UpsideDownLabelHandling
Handling techniques for upside down labels.
@ FlipUpsideDownLabels
Upside-down labels (90 <= angle < 270) are shown upright.
virtual QgsAbstractGeometry * boundary() const =0
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
int valueAsInt(int key, const QgsExpressionContext &context, int defaultValue=0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as an integer.
bool valueAsBool(int key, const QgsExpressionContext &context, bool defaultValue=false, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as an boolean.
double valueAsDouble(int key, const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a double.
virtual bool readXml(const QDomElement &collectionElem, const QgsPropertiesDefinition &definitions)
Reads property collection state from an XML element.
QString valueAsString(int key, const QgsExpressionContext &context, const QString &defaultString=QString(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a string.
virtual bool writeXml(QDomElement &collectionElem, const QgsPropertiesDefinition &definitions) const
Writes the current state of the property collection into an XML element.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QgsFontManager * fontManager()
Returns the application font manager, which manages available fonts and font installation for the QGI...
static QgsCalloutRegistry * calloutRegistry()
Returns the application's callout registry, used for managing callout types.
Registry of available callout classes.
static QgsCallout * defaultCallout()
Create a new instance of a callout with default settings.
Contains additional contextual information about the context in which a callout is being rendered.
Abstract base class for callout renderers.
virtual void stopRender(QgsRenderContext &context)
Finalises the callout after a set of rendering operations on the specified render context.
void render(QgsRenderContext &context, const QRectF &rect, const double angle, const QgsGeometry &anchor, QgsCalloutContext &calloutContext)
Renders the callout onto the specified render context.
virtual void startRender(QgsRenderContext &context)
Prepares the callout for rendering on the specified render context.
bool enabled() const
Returns true if the the callout is enabled.
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
This class represents a coordinate reference system (CRS).
QString userFriendlyIdentifier(Qgis::CrsIdentifierType type=Qgis::CrsIdentifierType::MediumString) const
Returns a user friendly identifier for the CRS.
Custom exception class for Coordinate Reference System related exceptions.
Curve polygon geometry type.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for the context.
Class for parsing and evaluation of expressions (formerly called "search strings").
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
bool hasParserError() const
Returns true if an error occurred when parsing the input expression.
QString evalErrorString() const
Returns evaluation error.
QString parserErrorString() const
Returns parser error.
QSet< QString > referencedColumns() const
Gets list of columns referenced by the expression.
bool hasEvalError() const
Returns true if an error occurred when evaluating last input.
QVariant evaluate()
Evaluate the feature and return the result.
virtual Qgis::FeatureRendererFlags flags() const
Returns flags associated with the renderer.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Q_INVOKABLE 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.
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
QString processFontFamilyName(const QString &name) const
Processes a font family name, applying any matching fontFamilyReplacements() to the name.
static QFont createFont(const QString &family, int pointSize=-1, int weight=-1, bool italic=false)
Creates a font with the specified family.
static bool fontFamilyOnSystem(const QString &family)
Check whether font family is on system in a quick manner, which does not compare [foundry].
static bool updateFontViaStyle(QFont &f, const QString &fontstyle, bool fallback=false)
Updates font with named style and retain all font properties.
A geometry is the spatial representation of a feature.
QgsGeometry clipped(const QgsRectangle &rectangle)
Clips the geometry using the specified rectangle.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
double length() const
Returns the planar, 2-dimensional length of geometry.
QgsAbstractGeometry::const_part_iterator const_parts_begin() const
Returns STL-style const iterator pointing to the first part of the geometry.
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
QgsGeometry makeValid(Qgis::MakeValidMethod method=Qgis::MakeValidMethod::Linework, bool keepCollapsed=false) const
Attempts to make an invalid geometry valid without losing vertices.
QString lastError() const
Returns an error string referring to the last error encountered either when this geometry was created...
bool isAxisParallelRectangle(double maximumDeviation, bool simpleRectanglesOnly=false) const
Returns true if the geometry is a polygon that is almost an axis-parallel rectangle.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
QgsAbstractGeometry * get()
Returns a modifiable (non-const) reference to the underlying abstract geometry primitive.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
bool contains(const QgsPointXY *p) const
Returns true if the geometry contains the point p.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
void filterVertices(const std::function< bool(const QgsPoint &) > &filter)
Filters the vertices from the geometry in place, removing any which do not return true for the filter...
bool isGeosValid(Qgis::GeometryValidityFlags flags=Qgis::GeometryValidityFlags()) const
Checks validity of the geometry using GEOS.
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
double area() const
Returns the planar, 2-dimensional area of the geometry.
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type.
QgsGeometry centroid() const
Returns the center of mass of a geometry.
QgsGeometry intersection(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters()) const
Returns a geometry representing the points shared by this geometry and other.
QgsGeometry mergeLines() const
Merges any connected lines in a LineString/MultiLineString geometry and converts them to single line ...
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
QgsAbstractGeometry::const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry.
bool convertGeometryCollectionToSubclass(Qgis::GeometryType geomType)
Converts geometry collection to a the desired geometry type subclass (multi-point,...
QgsGeometry simplify(double tolerance) const
Returns a simplified version of this geometry using a specified tolerance value.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
Qgis::GeometryOperationResult rotate(double rotation, const QgsPointXY ¢er)
Rotate this geometry around the Z axis.
Q_INVOKABLE QString asWkt(int precision=17) const
Exports the geometry to WKT.
static geos::unique_ptr asGeos(const QgsGeometry &geometry, double precision=0, Qgis::GeosCreationFlags flags=Qgis::GeosCreationFlags())
Returns a geos geometry - caller takes ownership of the object (should be deleted with GEOSGeom_destr...
Contains settings related to how the label engine places and formats labels for line features (or pol...
void setPlacementFlags(Qgis::LabelLinePlacementFlags flags)
Returns the line placement flags, which dictate how line labels can be placed above or below the line...
Qgis::LabelLinePlacementFlags placementFlags() const
Returns the line placement flags, which dictate how line labels can be placed above or below the line...
AnchorType
Line anchor types.
bool reverseDirectionSymbol() const
Returns true if direction symbols should be reversed.
void setLineAnchorPercent(double percent)
Sets the percent along the line at which labels should be placed.
DirectionSymbolPlacement directionSymbolPlacement() const
Returns the placement for direction symbols.
AnchorClipping
Clipping behavior for line anchor calculation.
@ UseEntireLine
Entire original feature line geometry is used when calculating the line anchor for labels.
@ UseVisiblePartsOfLine
Only visible parts of lines are considered when calculating the line anchor for labels.
void setDirectionSymbolPlacement(DirectionSymbolPlacement placement)
Sets the placement for direction symbols.
AnchorType anchorType() const
Returns the line anchor type, which dictates how the lineAnchorPercent() setting is handled.
Qgis::RenderUnit overrunDistanceUnit() const
Returns the units for label overrun distance.
QString leftDirectionSymbol() const
Returns the string to use for left direction arrows.
void setAnchorTextPoint(AnchorTextPoint point)
Sets the line anchor text point, which dictates which part of the label text should be placed at the ...
void setLeftDirectionSymbol(const QString &symbol)
Sets the string to use for left direction arrows.
QgsMapUnitScale overrunDistanceMapUnitScale() const
Returns the map unit scale for label overrun distance.
AnchorTextPoint anchorTextPoint() const
Returns the line anchor text point, which dictates which part of the label text should be placed at t...
double overrunDistance() const
Returns the distance which labels are allowed to overrun past the start or end of line features.
void setMergeLines(bool merge)
Sets whether connected line features with identical label text should be merged prior to generating l...
DirectionSymbolPlacement
Placement options for direction symbols.
@ SymbolLeftRight
Place direction symbols on left/right of label.
@ SymbolAbove
Place direction symbols on above label.
@ SymbolBelow
Place direction symbols on below label.
void setRightDirectionSymbol(const QString &symbol)
Sets the string to use for right direction arrows.
@ CenterOfText
Anchor using center of text.
QString rightDirectionSymbol() const
Returns the string to use for right direction arrows.
void setAnchorClipping(AnchorClipping clipping)
Sets the line anchor clipping mode, which dictates how line strings are clipped before calculating th...
void setOverrunDistanceMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for label overrun distance.
bool addDirectionSymbol() const
Returns true if '<' or '>' (or custom strings set via leftDirectionSymbol and rightDirectionSymbol) w...
double lineAnchorPercent() const
Returns the percent along the line at which labels should be placed.
bool mergeLines() const
Returns true if connected line features with identical label text should be merged prior to generatin...
void setAnchorType(AnchorType type)
Sets the line anchor type, which dictates how the lineAnchorPercent() setting is handled.
void setOverrunDistanceUnit(const Qgis::RenderUnit &unit)
Sets the unit for label overrun distance.
void setOverrunDistance(double distance)
Sets the distance which labels are allowed to overrun past the start or end of line features.
AnchorClipping anchorClipping() const
Returns the line anchor clipping mode, which dictates how line strings are clipped before calculating...
void setReverseDirectionSymbol(bool reversed)
Sets whether the direction symbols should be reversed.
void setAddDirectionSymbol(bool enabled)
Sets whether '<' or '>' (or custom strings set via leftDirectionSymbol and rightDirectionSymbol) will...
void updateDataDefinedProperties(const QgsPropertyCollection &properties, QgsExpressionContext &context)
Updates the line settings to respect any data defined properties set within the specified properties ...
Contains settings related to how the label engine treats features as obstacles.
double factor() const
Returns the obstacle factor, where 1.0 = default, < 1.0 more likely to be covered by labels,...
void setType(ObstacleType type)
Controls how features act as obstacles for labels.
ObstacleType type() const
Returns how features act as obstacles for labels.
ObstacleType
Valid obstacle types, which affect how features within the layer will act as obstacles for labels.
@ PolygonInterior
Avoid placing labels over interior of polygon (prefer placing labels totally outside or just slightly...
void setIsObstacle(bool isObstacle)
Sets whether features are obstacles to labels of other layers.
void setFactor(double factor)
Sets the obstacle factor, where 1.0 = default, < 1.0 more likely to be covered by labels,...
void updateDataDefinedProperties(const QgsPropertyCollection &properties, QgsExpressionContext &context)
Updates the obstacle settings to respect any data defined properties set within the specified propert...
void setObstacleGeometry(const QgsGeometry &obstacleGeom)
Sets the label's obstacle geometry, if different to the feature geometry.
bool isObstacle() const
Returns true if the features are obstacles to labels of other layers.
void setOverlapHandling(Qgis::LabelOverlapHandling handling)
Sets the technique used to handle overlapping labels.
Qgis::LabelOverlapHandling overlapHandling() const
Returns the technique used to handle overlapping labels.
void setPrioritization(Qgis::LabelPrioritization prioritization)
Sets the technique used to prioritize labels.
bool allowDegradedPlacement() const
Returns true if labels can be placed in inferior fallback positions if they cannot otherwise be place...
void setAllowDegradedPlacement(bool allow)
Sets whether labels can be placed in inferior fallback positions if they cannot otherwise be placed.
Qgis::LabelPrioritization prioritization() const
Returns the label prioritization technique.
Contains settings related to how the label engine places and formats labels for point features,...
void setMaximumDistance(double distance)
Sets the maximum distance which labels are allowed to be from their corresponding points.
QgsMapUnitScale maximumDistanceMapUnitScale() const
Returns the map unit scale for label maximum distance.
void setMaximumDistanceMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for label maximum distance.
double maximumDistance() const
Returns the maximum distance which labels are allowed to be from their corresponding points.
void setQuadrant(Qgis::LabelQuadrantPosition quadrant)
Sets the quadrant in which to offset labels from the point.
Qgis::LabelQuadrantPosition quadrant() const
Returns the quadrant in which to offset labels from the point.
Qgis::RenderUnit maximumDistanceUnit() const
Returns the units for label maximum distance.
void setMaximumDistanceUnit(Qgis::RenderUnit unit)
Sets the unit for label maximum distance.
QVector< Qgis::LabelPredefinedPointPosition > predefinedPositionOrder() const
Returns the ordered list of predefined label positions for points.
void setPredefinedPositionOrder(const QVector< Qgis::LabelPredefinedPointPosition > &order)
Sets the ordered list of predefined label positions for points.
void updateDataDefinedProperties(const QgsPropertyCollection &properties, QgsExpressionContext &context)
Updates the point settings to respect any data defined properties set within the specified properties...
Contains settings related to how the label engine removes candidate label positions and reduces the n...
void setMaximumNumberLabels(int number)
Sets the maximum number of labels which should be drawn for this layer.
double minimumFeatureSize() const
Returns the minimum feature size (in millimeters) for a feature to be labelled.
int maximumNumberLabels() const
Returns the maximum number of labels which should be drawn for this layer.
void updateDataDefinedProperties(const QgsPropertyCollection &properties, QgsExpressionContext &context)
Updates the thinning settings to respect any data defined properties set within the specified propert...
void setLimitNumberLabelsEnabled(bool enabled)
Sets whether the the number of labels drawn for the layer should be limited.
bool limitNumberOfLabelsEnabled() const
Returns true if the number of labels drawn for the layer should be limited.
void setMinimumFeatureSize(double size)
Sets the minimum feature size (in millimeters) for a feature to be labelled.
static QString encodePredefinedPositionOrder(const QVector< Qgis::LabelPredefinedPointPosition > &positions)
Encodes an ordered list of predefined point label positions to a string.
static QVector< Qgis::LabelPredefinedPointPosition > decodePredefinedPositionOrder(const QString &positionString)
Decodes a string to an ordered list of predefined point label positions.
Line string geometry type, with support for z-dimension and m-values.
Base class for all map layer types.
Q_INVOKABLE QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
void removeCustomProperty(const QString &key)
Remove a custom property from layer.
T customEnumProperty(const QString &key, const T &defaultValue)
Returns the property value for a property based on an enum.
The QgsMapSettings class contains configuration for rendering of the map.
const QgsMapToPixel & mapToPixel() const
double extentBuffer() const
Returns the buffer in map units to use around the visible extent for rendering symbols whose correspo...
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes output image size into account.
double rotation() const
Returns the rotation of the resulting map image, in degrees clockwise.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
Implementation of GeometrySimplifier using the "MapToPixel" algorithm.
@ SimplifyEnvelope
The geometries can be fully simplified by its BoundingBox.
QgsGeometry simplify(const QgsGeometry &geometry) const override
Returns a simplified version the specified geometry.
Perform transforms between map coordinates and device coordinates.
double mapUnitsPerPixel() const
Returns the current map units per pixel.
QgsPointXY toMapCoordinates(int x, int y) const
Transforms device coordinates to map (world) coordinates.
double mapRotation() const
Returns the current map rotation in degrees (clockwise).
void setParameters(double mapUnitsPerPixel, double centerX, double centerY, int widthPixels, int heightPixels, double rotation)
Sets parameters for use in transforming coordinates.
double maxScale
The maximum scale, or 0.0 if unset.
double minScale
The minimum scale, or 0.0 if unset.
The QgsMargins class defines the four margins of a rectangle.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
const QgsAbstractMeshLayerLabeling * labeling() const
Access to const labeling configuration.
bool labelsEnabled() const
Returns whether the layer contains labels which are enabled and should be drawn.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
Adds a message to the log instance (and creates it if necessary).
Multi surface geometry collection.
static QStringList splitToLines(const QString &text, const QString &wrapCharacter, int autoWrapLength=0, bool useMaxLineLengthWhenAutoWrapping=true)
Splits a text string to a list of separate lines, using a specified wrap character (wrapCharacter).
static QgsGeometry prepareGeometry(const QgsGeometry &geometry, QgsRenderContext &context, const QgsCoordinateTransform &ct, const QgsGeometry &clipGeometry=QgsGeometry(), bool mergeLines=false)
Prepares a geometry for registration with PAL.
static bool geometryRequiresPreparation(const QgsGeometry &geometry, QgsRenderContext &context, const QgsCoordinateTransform &ct, const QgsGeometry &clipGeometry=QgsGeometry(), bool mergeLines=false)
Checks whether a geometry requires preparation before registration with PAL.
static bool staticWillUseLayer(const QgsMapLayer *layer)
Called to find out whether a specified layer is used for labeling.
static QStringList splitToGraphemes(const QString &text)
Splits a text string to a list of graphemes, which are the smallest allowable character divisions in ...
Contains settings for how a map layer will be labeled.
bool fitInPolygonOnly
true if only labels which completely fit within a polygon are allowed.
double yOffset
Vertical offset of label.
QgsMapUnitScale labelOffsetMapUnitScale
Map unit scale for label offset.
int fontMaxPixelSize
Maximum pixel size for showing rendered map unit labels (1 - 10000).
std::unique_ptr< QgsLabelFeature > registerFeatureWithDetails(const QgsFeature &feature, QgsRenderContext &context, QgsGeometry obstacleGeometry=QgsGeometry(), const QgsSymbol *symbol=nullptr)
Registers a feature for labeling.
double maxCurvedCharAngleIn
Maximum angle between inside curved label characters (valid range 20.0 to 60.0).
void setFormat(const QgsTextFormat &format)
Sets the label text formatting settings, e.g., font settings, buffer settings, etc.
double zIndex
Z-Index of label, where labels with a higher z-index are rendered on top of labels with a lower z-ind...
const QgsMapToPixel * xform
void startRender(QgsRenderContext &context)
Prepares the label settings for rendering.
QString wrapChar
Wrapping character string.
QSet< QString > referencedFields(const QgsRenderContext &context) const
Returns all field names referenced by the configuration (e.g.
Qgis::LabelOffsetType offsetType
Offset type for layer (only applies in certain placement modes)
double xOffset
Horizontal offset of label.
Qgis::LabelPlacement placement
Label placement mode.
QgsCoordinateTransform ct
bool drawLabels
Whether to draw labels for this layer.
bool fontLimitPixelSize
true if label sizes should be limited by pixel size.
QgsExpression * getLabelExpression()
Returns the QgsExpression for this label settings.
QString legendString() const
legendString
double minimumScale
The minimum map scale (i.e.
Q_DECL_DEPRECATED void calculateLabelSize(const QFontMetricsF *fm, const QString &text, double &labelX, double &labelY, const QgsFeature *f=nullptr, QgsRenderContext *context=nullptr, double *rotatedLabelX=nullptr, double *rotatedLabelY=nullptr)
Calculates the space required to render the provided text in map units.
void registerFeature(const QgsFeature &f, QgsRenderContext &context)
Registers a feature for labeling.
QgsPalLayerSettings & operator=(const QgsPalLayerSettings &s)
copy operator - only copies the permanent members
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Read settings from a DOM element.
bool scaleVisibility
Set to true to limit label visibility to a range of scales.
double repeatDistance
Distance for repeating labels for a single feature.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the label's property collection, used for data defined overrides.
bool geometryGeneratorEnabled
Defines if the geometry generator is enabled or not. If disabled, the standard geometry will be taken...
Qgis::LabelMultiLineAlignment multilineAlign
Horizontal alignment of multi-line labels.
bool centroidInside
true if centroid positioned labels must be placed inside their corresponding feature polygon,...
int priority
Label priority.
Qgis::GeometryType geometryGeneratorType
The type of the result geometry of the geometry generator.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Write settings into a DOM element.
bool labelPerPart
true if every part of a multi-part feature should be labeled.
QgsCallout * callout() const
Returns the label callout renderer, responsible for drawing label callouts.
int fontMinPixelSize
Minimum pixel size for showing rendered map unit labels (1 - 1000).
double angleOffset
Label rotation, in degrees clockwise.
double maxCurvedCharAngleOut
Maximum angle between outside curved label characters (valid range -20.0 to -95.0)
Qgis::AngleUnit rotationUnit() const
Unit for rotation of labels.
Qgis::GeometryType layerType
Geometry type of layers associated with these settings.
Qgis::RenderUnit offsetUnits
Units for offsets of label.
bool isExpression
true if this label is made from a expression string, e.g., FieldName || 'mm'
bool preserveRotation
True if label rotation should be preserved during label pin/unpin operations.
bool plusSign
Whether '+' signs should be prepended to positive numeric labels.
bool prepare(QgsRenderContext &context, QSet< QString > &attributeNames, const QgsFields &fields, const QgsMapSettings &mapSettings, const QgsCoordinateReferenceSystem &crs)
Prepare for registration of features.
QString geometryGenerator
The geometry generator expression. Null if disabled.
const QgsLabelLineSettings & lineSettings() const
Returns the label line settings, which contain settings related to how the label engine places and fo...
QgsMapUnitScale distMapUnitScale
Map unit scale for label feature distance.
QgsStringReplacementCollection substitutions
Substitution collection for automatic text substitution with labels.
Q_DECL_DEPRECATED QColor previewBkgrdColor
const QgsFeature * mCurFeat
int decimals
Number of decimal places to show for numeric labels.
double dist
Distance from feature to the label.
void setRotationUnit(Qgis::AngleUnit angleUnit)
Set unit for rotation of labels.
QgsMapUnitScale repeatDistanceMapUnitScale
Map unit scale for repeating labels for a single feature.
Qgis::RenderUnit distUnits
Units the distance from feature to the label.
bool centroidWhole
true if feature centroid should be calculated from the whole feature, or false if only the visible pa...
Property
Data definable properties.
@ PositionX
X-coordinate data defined label position.
@ LinePlacementOptions
Line placement flags.
@ MinScale
Min scale (deprecated, for old project compatibility only)
@ FontSizeUnit
Font size units.
@ LabelRotation
Label rotation.
@ FontStyle
Font style name.
@ ShapeTransparency
Shape transparency (deprecated)
@ Italic
Use italic style.
@ ShapeOpacity
Shape opacity.
@ AllowDegradedPlacement
Allow degraded label placements.
@ MaskEnabled
Whether the mask is enabled.
@ PredefinedPositionOrder
@ OverlapHandling
Overlap handling technique.
@ PositionY
Y-coordinate data defined label position.
@ MaximumScale
Maximum map scale (ie most "zoomed in")
@ Vali
Vertical alignment for data defined label position (Bottom, Base, Half, Cap, Top)
@ MinimumScale
Minimum map scale (ie most "zoomed out")
@ FontStretchFactor
Font stretch factor, since QGIS 3.24.
@ PolygonLabelOutside
Whether labels outside a polygon feature are permitted, or should be forced.
@ LineAnchorType
Line anchor type.
@ MaxScale
Max scale (deprecated, for old project compatibility only)
@ BufferOpacity
Buffer opacity.
@ BufferTransp
Buffer transparency (deprecated)
@ LineAnchorClipping
Clipping mode for line anchor calculation.
@ MaskJoinStyle
Mask join style.
@ Strikeout
Use strikeout.
@ LabelAllParts
Whether all parts of multi-part features should be labeled.
@ Underline
Use underline.
@ FontBlendMode
Text blend mode.
@ LineAnchorPercent
Portion along line at which labels should be anchored.
@ FontCase
Label text case.
@ Hali
Horizontal alignment for data defined label position (Left, Center, Right)
@ MaskOpacity
Mask opacity.
@ LineAnchorTextPoint
Line anchor text point.
@ ShadowTransparency
Shadow transparency (deprecated)
@ OverrunDistance
Distance which labels can extend past either end of linear features.
@ MaskBufferUnit
Mask buffer size unit.
@ FontOpacity
Text opacity.
@ FontWordSpacing
Word spacing.
@ FontTransp
Text transparency (deprecated)
@ CalloutDraw
Show callout.
@ MaskBufferSize
Mask buffer size.
@ FontLetterSpacing
Letter spacing.
@ TabStopDistance
Tab stop distance, since QGIS 3.38.
@ ShadowOpacity
Shadow opacity.
@ PositionPoint
Point-coordinate data defined label position.
@ MaximumDistance
Maximum distance of label from feature.
@ Rotation
Label rotation (deprecated, for old project compatibility only)
Qgis::RenderUnit repeatDistanceUnit
Units for repeating labels for a single feature.
Qgis::UpsideDownLabelHandling upsidedownLabels
Controls whether upside down labels are displayed and how they are handled.
QString fieldName
Name of field (or an expression) to use for label text.
static QPixmap labelSettingsPreviewPixmap(const QgsPalLayerSettings &settings, QSize size, const QString &previewText=QString(), int padding=0, const QgsScreenProperties &screen=QgsScreenProperties())
Returns a pixmap preview for label settings.
bool formatNumbers
Set to true to format numeric label text as numbers (e.g.
bool containsAdvancedEffects() const
Returns true if any component of the label settings requires advanced effects such as blend modes,...
const QgsTextFormat & format() const
Returns the label text formatting settings, e.g., font settings, buffer settings, etc.
void setCallout(QgsCallout *callout)
Sets the label callout renderer, responsible for drawing label callouts.
double maximumScale
The maximum map scale (i.e.
int autoWrapLength
If non-zero, indicates that label text should be automatically wrapped to (ideally) the specified num...
Qgis::UnplacedLabelVisibility unplacedVisibility() const
Returns the layer's unplaced label visibility.
bool useMaxLineLengthForAutoWrap
If true, indicates that when auto wrapping label text the autoWrapLength length indicates the maximum...
void setUnplacedVisibility(Qgis::UnplacedLabelVisibility visibility)
Sets the layer's unplaced label visibility.
const QgsLabelPointSettings & pointSettings() const
Returns the label point settings, which contain settings related to how the label engine places and f...
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the labeling property definitions.
void stopRender(QgsRenderContext &context)
Finalises the label settings after use.
bool useSubstitutions
True if substitutions should be applied.
A class to represent a 2D point.
double distance(double x, double y) const
Returns the distance between this point and a specified x, y coordinate.
Point geometry type, with support for z-dimension and m-values.
bool isEmpty() const override
Returns true if the geometry is empty.
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.
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
bool isActive(int key) const final
Returns true if the collection contains an active property with the specified key.
void clear() final
Removes all properties from the collection.
bool prepare(const QgsExpressionContext &context=QgsExpressionContext()) const final
Prepares the collection against a specified expression context.
bool hasActiveProperties() const final
Returns true if the collection has any active properties, or false if all properties within the colle...
QgsProperty property(int key) const final
Returns a matching property from the collection, if one exists.
QSet< QString > referencedFields(const QgsExpressionContext &context=QgsExpressionContext(), bool ignoreContext=false) const final
Returns the set of any fields referenced by the active properties from the collection.
Definition for a property.
@ Double
Double value (including negative values)
@ Double0To1
Double value between 0-1 (inclusive)
@ StrokeWidth
Line stroke width.
@ String
Any string value.
@ RenderUnits
Render units (eg mm/pixels/map units)
@ PenJoinStyle
Pen join style.
@ SvgPath
Path to an SVG file.
@ IntegerPositiveGreaterZero
Non-zero positive integer values.
@ IntegerPositive
Positive integer values (including 0)
@ ColorNoAlpha
Color with no alpha channel.
@ Rotation
Rotation (value between 0-360 degrees)
@ ColorWithAlpha
Color with alpha channel.
@ DoublePositive
Positive double value (including 0)
@ Size2D
2D size (width/height different)
@ DataTypeString
Property requires a string value.
@ DataTypeNumeric
Property requires a numeric value.
A store for object properties.
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
static QgsProperty fromField(const QString &fieldName, bool isActive=true)
Returns a new FieldBasedProperty created from the specified field name.
void setActive(bool active)
Sets whether the property is currently active.
Represents a raster layer.
const QgsAbstractRasterLayerLabeling * labeling() const
Access to const labeling configuration.
bool labelsEnabled() const
Returns whether the layer contains labels which are enabled and should be drawn.
The class is used as a container of context for various read/write operations on other objects.
A rectangle specified with double values.
Q_INVOKABLE QString toString(int precision=16) const
Returns a string representation of form xmin,ymin : xmax,ymax Coordinates will be truncated to the sp...
bool contains(const QgsRectangle &rect) const
Returns true when rectangle contains other rectangle.
void grow(double delta)
Grows the rectangle in place by the specified amount.
QgsCoordinateReferenceSystem crs() const
Returns the associated coordinate reference system, or an invalid CRS if no reference system is set.
A QgsGeometry with associated coordinate reference system.
Contains information about the context of a rendering operation.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
double convertToMapUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to map units.
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
QgsVectorSimplifyMethod & vectorSimplifyMethod()
Returns the simplification settings to use when rendering vector layers.
double symbologyReferenceScale() const
Returns the symbology reference scale.
void setDevicePixelRatio(float ratio)
Sets the device pixel ratio.
void setUseAdvancedEffects(bool enabled)
Used to enable or disable advanced effects such as blend modes.
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
double rendererScale() const
Returns the renderer map scale.
QgsExpressionContext & expressionContext()
Gets the expression context.
QgsGeometry featureClipGeometry() const
Returns the geometry to use to clip features at render time.
QgsRectangle mapExtent() const
Returns the original extent of the map being rendered.
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
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.
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
const QgsPathResolver & pathResolver() const
Returns the path resolver for conversion between relative and absolute paths during rendering operati...
static bool equalToOrGreaterThanMinimumScale(const double scale, const double minScale)
Returns whether the scale is equal to or greater than the minScale, taking non-round numbers into acc...
static bool lessThanMaximumScale(const double scale, const double maxScale)
Returns whether the scale is less than the maxScale, taking non-round numbers into account.
Stores properties relating to a screen.
double devicePixelRatio() const
Returns the ratio between physical pixels and device-independent pixels for the screen.
bool isValid() const
Returns true if the properties are valid.
void updateRenderContextForScreen(QgsRenderContext &context) const
Updates the settings in a render context to match the screen settings.
void readXml(const QDomElement &elem)
Reads the collection state from an XML element.
QString process(const QString &input) const
Processes a given input string, applying any valid replacements which should be made using QgsStringR...
void writeXml(QDomElement &elem, QDomDocument &doc) const
Writes the collection state to an XML element.
static QString capitalize(const QString &string, Qgis::Capitalization capitalization)
Converts a string by applying capitalization rules to the string.
static QString wordWrap(const QString &string, int length, bool useMaxLineLength=true, const QString &customDelimiter=QString())
Automatically wraps a string by inserting new line characters at appropriate locations in the string.
QgsTextFormat defaultTextFormat(QgsStyle::TextFormatContext context=QgsStyle::TextFormatContext::Labeling) const
Returns the default text format to use for new text based objects in the specified context.
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
@ Labeling
Text format used in labeling.
static Qt::PenJoinStyle decodePenJoinStyle(const QString &str)
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
static QPointF toPoint(const QVariant &value, bool *ok=nullptr)
Converts a value to a point.
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
static QSizeF toSize(const QVariant &value, bool *ok=nullptr)
Converts a value to a size.
static QPainter::CompositionMode decodeBlendMode(const QString &s)
static QString encodeSize(QSizeF size)
Encodes a QSizeF to a string.
static QString svgSymbolNameToPath(const QString &name, const QgsPathResolver &pathResolver)
Determines an SVG symbol's path from its name.
static QString encodePoint(QPointF point)
Encodes a QPointF to a string.
static QString encodePenJoinStyle(Qt::PenJoinStyle style)
Abstract base class for all rendered symbols.
Container for settings relating to a text background object.
void setRadiiUnit(Qgis::RenderUnit units)
Sets the units used for the shape's radii.
QString svgFile() const
Returns the absolute path to the background SVG file, if set.
QSizeF size() const
Returns the size of the background shape.
QSizeF radii() const
Returns the radii used for rounding the corners of shapes.
void setOpacity(double opacity)
Sets the background shape's opacity.
void setStrokeColor(const QColor &color)
Sets the color used for outlining the background shape.
Qt::PenJoinStyle joinStyle() const
Returns the join style used for drawing the background shape.
SizeType
Methods for determining the background shape size.
bool enabled() const
Returns whether the background is enabled.
void setJoinStyle(Qt::PenJoinStyle style)
Sets the join style used for drawing the background shape.
double opacity() const
Returns the background shape's opacity.
double rotation() const
Returns the rotation for the background shape, in degrees clockwise.
QColor fillColor() const
Returns the color used for filing the background shape.
void setRadii(QSizeF radii)
Sets the radii used for rounding the corners of shapes.
SizeType sizeType() const
Returns the method used to determine the size of the background shape (e.g., fixed size or buffer aro...
ShapeType type() const
Returns the type of background shape (e.g., square, ellipse, SVG).
double strokeWidth() const
Returns the width of the shape's stroke (stroke).
void setSizeType(SizeType type)
Sets the method used to determine the size of the background shape (e.g., fixed size or buffer around...
ShapeType
Background shape types.
@ ShapeMarkerSymbol
Marker symbol.
void setFillColor(const QColor &color)
Sets the color used for filing the background shape.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units used for the shape's size.
QColor strokeColor() const
Returns the color used for outlining the background shape.
void setRotationType(RotationType type)
Sets the method used for rotating the background shape.
void setBlendMode(QPainter::CompositionMode mode)
Sets the blending mode used for drawing the background shape.
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the shape size.
void setType(ShapeType type)
Sets the type of background shape to draw (e.g., square, ellipse, SVG).
Qgis::RenderUnit sizeUnit() const
Returns the units used for the shape's size.
RotationType
Methods for determining the rotation of the background shape.
void setEnabled(bool enabled)
Sets whether the text background will be drawn.
QgsMarkerSymbol * markerSymbol() const
Returns the marker symbol to be rendered in the background.
void setRotation(double rotation)
Sets the rotation for the background shape, in degrees clockwise.
void setStrokeWidthUnit(Qgis::RenderUnit units)
Sets the units used for the shape's stroke width.
void setOffsetUnit(Qgis::RenderUnit units)
Sets the units used for the shape's offset.
void setOffset(QPointF offset)
Sets the offset used for drawing the background shape.
void setSize(QSizeF size)
Sets the size of the background shape.
void setSvgFile(const QString &file)
Sets the path to the background SVG file.
void setStrokeWidth(double width)
Sets the width of the shape's stroke (stroke).
QPointF offset() const
Returns the offset used for drawing the background shape.
Container for settings relating to a text buffer.
void setBlendMode(QPainter::CompositionMode mode)
Sets the blending mode used for drawing the buffer.
Qgis::RenderUnit sizeUnit() const
Returns the units for the buffer size.
Qt::PenJoinStyle joinStyle() const
Returns the buffer join style.
double size() const
Returns the size of the buffer.
void setColor(const QColor &color)
Sets the color for the buffer.
void setOpacity(double opacity)
Sets the buffer opacity.
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the buffer size.
bool enabled() const
Returns whether the buffer is enabled.
double opacity() const
Returns the buffer opacity.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units used for the buffer size.
void setEnabled(bool enabled)
Sets whether the text buffer will be drawn.
QColor color() const
Returns the color of the buffer.
void setJoinStyle(Qt::PenJoinStyle style)
Sets the join style used for drawing the buffer.
void setSize(double size)
Sets the size of the buffer.
Contains pre-calculated metrics of a QgsTextDocument.
QSizeF documentSize(Qgis::TextLayoutMode mode, Qgis::TextOrientation orientation) const
Returns the overall size of the document.
static QgsTextDocumentMetrics calculateMetrics(const QgsTextDocument &document, const QgsTextFormat &format, const QgsRenderContext &context, double scaleFactor=1.0, const QgsTextDocumentRenderContext &documentContext=QgsTextDocumentRenderContext())
Returns precalculated text metrics for a text document, when rendered using the given base format and...
QRectF outerBounds(Qgis::TextLayoutMode mode, Qgis::TextOrientation orientation) const
Returns the outer bounds of the document, which is the documentSize() adjusted to account for any tex...
Represents a document consisting of one or more QgsTextBlock objects.
void splitLines(const QString &wrapCharacter, int autoWrapLength=0, bool useMaxLineLengthWhenAutoWrapping=true)
Splits lines of text in the document to separate lines, using a specified wrap character (wrapCharact...
static QgsTextDocument fromHtml(const QStringList &lines)
Constructor for QgsTextDocument consisting of a set of HTML formatted lines.
static QgsTextDocument fromTextAndFormat(const QStringList &lines, const QgsTextFormat &format)
Constructor for QgsTextDocument consisting of a set of lines, respecting settings from a text format.
Defines a tab position for a text format.
Container for all settings relating to text rendering.
void setColor(const QColor &color)
Sets the color that text will be rendered in.
void setBlendMode(QPainter::CompositionMode mode)
Sets the blending mode used for drawing the text.
void setSize(double size)
Sets the size for rendered text.
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the size.
void setOrientation(Qgis::TextOrientation orientation)
Sets the orientation for the text.
void setFont(const QFont &font)
Sets the font used for rendering text.
QSet< QString > referencedFields(const QgsRenderContext &context) const
Returns all field names referenced by the configuration (e.g.
double lineHeight() const
Returns the line height for text.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units for the size of rendered text.
int stretchFactor() const
Returns the text's stretch factor.
void setShadow(const QgsTextShadowSettings &shadowSettings)
Sets the text's drop shadow settings.
void setMask(const QgsTextMaskSettings &maskSettings)
Sets the text's masking settings.
QFont scaledFont(const QgsRenderContext &context, double scaleFactor=1.0, bool *isZeroSize=nullptr) const
Returns a font with the size scaled to match the format's size settings (including units and map unit...
void setOpacity(double opacity)
Sets the text's opacity.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Read settings from a DOM element.
Qgis::RenderUnit lineHeightUnit() const
Returns the units for the line height for text.
Qgis::Capitalization capitalization() const
Returns the text capitalization style.
QgsTextMaskSettings & mask()
Returns a reference to the masking settings.
void setBuffer(const QgsTextBufferSettings &bufferSettings)
Sets the text's buffer settings.
QgsTextBackgroundSettings & background()
Returns a reference to the text background settings.
Qgis::RenderUnit sizeUnit() const
Returns the units for the size of rendered text.
bool allowHtmlFormatting() const
Returns true if text should be treated as a HTML document and HTML tags should be used for formatting...
double opacity() const
Returns the text's opacity.
void setTabStopDistance(double distance)
Sets the distance for tab stops.
Qgis::TextOrientation orientation() const
Returns the orientation of the text.
QString namedStyle() const
Returns the named style for the font used for rendering text (e.g., "bold").
double size() const
Returns the size for rendered text.
QgsTextShadowSettings & shadow()
Returns a reference to the text drop shadow settings.
void setTabPositions(const QList< QgsTextFormat::Tab > &positions)
Sets the list of tab positions for tab stops.
void setBackground(const QgsTextBackgroundSettings &backgroundSettings)
Sets the text's background settings.q.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Write settings into a DOM element.
QColor color() const
Returns the color that text will be rendered in.
QFont font() const
Returns the font used for rendering text.
void readFromLayer(QgsVectorLayer *layer)
Reads settings from a layer's custom properties (for QGIS 2.x projects).
QColor previewBackgroundColor() const
Returns the background color for text previews.
bool containsAdvancedEffects() const
Returns true if any component of the font format requires advanced effects such as blend modes,...
QgsTextBufferSettings & buffer()
Returns a reference to the text buffer settings.
void setLineHeight(double height)
Sets the line height for text.
static QgsPrecalculatedTextMetrics calculateTextMetrics(const QgsMapToPixel *xform, const QgsRenderContext &context, const QgsTextFormat &format, const QFont &baseFont, const QFontMetricsF &fontMetrics, double letterSpacing, double wordSpacing, const QString &text=QString(), QgsTextDocument *document=nullptr, QgsTextDocumentMetrics *metrics=nullptr)
Calculate text metrics for later retrieval via textMetrics().
Container for settings relating to a selective masking around a text.
void setEnabled(bool)
Returns whether the mask is enabled.
void setSize(double size)
Sets the size of the buffer.
double size() const
Returns the size of the buffer.
void setJoinStyle(Qt::PenJoinStyle style)
Sets the join style used for drawing the buffer.
double opacity() const
Returns the mask's opacity.
bool enabled() const
Returns whether the mask is enabled.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units used for the buffer size.
Qt::PenJoinStyle joinStyle() const
Returns the buffer join style.
void setOpacity(double opacity)
Sets the mask's opacity.
static QgsTextBackgroundSettings::ShapeType decodeShapeType(const QString &string)
Decodes a string representation of a background shape type to a type.
static Qgis::TextOrientation decodeTextOrientation(const QString &name, bool *ok=nullptr)
Attempts to decode a string representation of a text orientation.
static QgsTextShadowSettings::ShadowPlacement decodeShadowPlacementType(const QString &string)
Decodes a string representation of a shadow placement type to a type.
static QgsTextBackgroundSettings::RotationType decodeBackgroundRotationType(const QString &string)
Decodes a string representation of a background rotation type to a type.
static QString encodeTextOrientation(Qgis::TextOrientation orientation)
Encodes a text orientation.
static QgsTextBackgroundSettings::SizeType decodeBackgroundSizeType(const QString &string)
Decodes a string representation of a background size type to a type.
static double textWidth(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, QFontMetricsF *fontMetrics=nullptr)
Returns the width of a text based on a given format.
static int sizeToPixel(double size, const QgsRenderContext &c, Qgis::RenderUnit unit, const QgsMapUnitScale &mapUnitScale=QgsMapUnitScale())
Calculates pixel size (considering output size should be in pixel or map units, scale factors and opt...
static void drawText(const QRectF &rect, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, Qgis::TextVerticalAlignment vAlignment=Qgis::TextVerticalAlignment::Top, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Rectangle)
Draws text within a rectangle using the specified settings.
static double textHeight(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Point, QFontMetricsF *fontMetrics=nullptr, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), double maxLineWidth=0)
Returns the height of a text based on a given format.
Container for settings relating to a text shadow.
int offsetAngle() const
Returns the angle for offsetting the position of the shadow from the text.
void setBlurRadiusUnit(Qgis::RenderUnit units)
Sets the units used for the shadow's blur radius.
bool enabled() const
Returns whether the shadow is enabled.
void setOffsetUnit(Qgis::RenderUnit units)
Sets the units used for the shadow's offset.
int scale() const
Returns the scaling used for the drop shadow (in percentage of original size).
void setShadowPlacement(QgsTextShadowSettings::ShadowPlacement placement)
Sets the placement for the drop shadow.
double opacity() const
Returns the shadow's opacity.
void setBlendMode(QPainter::CompositionMode mode)
Sets the blending mode used for drawing the drop shadow.
void setColor(const QColor &color)
Sets the color for the drop shadow.
QColor color() const
Returns the color of the drop shadow.
ShadowPlacement
Placement positions for text shadow.
void setScale(int scale)
Sets the scaling used for the drop shadow (in percentage of original size).
double offsetDistance() const
Returns the distance for offsetting the position of the shadow from the text.
void setOffsetDistance(double distance)
Sets the distance for offsetting the position of the shadow from the text.
void setOpacity(double opacity)
Sets the shadow's opacity.
void setOffsetAngle(int angle)
Sets the angle for offsetting the position of the shadow from the text.
double blurRadius() const
Returns the blur radius for the shadow.
void setBlurRadius(double blurRadius)
Sets the blur radius for the shadow.
void setEnabled(bool enabled)
Sets whether the text shadow will be drawn.
static Q_INVOKABLE double fromUnitToUnitFactor(Qgis::DistanceUnit fromUnit, Qgis::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
static Q_INVOKABLE Qgis::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
static Q_INVOKABLE QString encodeUnit(Qgis::DistanceUnit unit)
Encodes a distance unit to a string.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
Represents a vector layer which manages a vector based data sets.
bool labelsEnabled() const
Returns whether the layer contains labels which are enabled and should be drawn.
bool diagramsEnabled() const
Returns whether the layer contains diagrams which are enabled and should be drawn.
QgsFeatureRenderer * renderer()
Returns the feature renderer used for rendering the features in the layer in 2D map views.
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
This class contains information how to simplify geometries fetched from a vector layer.
double tolerance() const
Gets the tolerance of simplification in map units. Represents the maximum distance in map units betwe...
bool forceLocalOptimization() const
Gets where the simplification executes, after fetch the geometries from provider, or when supported,...
Qgis::VectorRenderingSimplificationFlags simplifyHints() const
Gets the simplification hints of the vector layer managed.
Qgis::VectorSimplificationAlgorithm simplifyAlgorithm() const
Gets the local simplification algorithm of the vector layer managed.
Basic labeling configuration for vector tile layers.
Implements a map layer that is dedicated to rendering of vector tiles.
QgsVectorTileLabeling * labeling() const
Returns currently assigned labeling.
T qgsEnumKeyToValue(const QString &key, const T &defaultValue, bool tryValueAsKey=true, bool *returnOk=nullptr)
Returns the value corresponding to the given key of an enum.
#define Q_NOWARN_DEPRECATED_POP
QString qgsEnumValueToKey(const T &value, bool *returnOk=nullptr)
Returns the value for the given key of an enum.
#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)
Q_GLOBAL_STATIC(QReadWriteLock, sDefinitionCacheLock)
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
QString updateDataDefinedString(const QString &value)
QVector< Qgis::LabelPredefinedPointPosition > PredefinedPointPositionVector
Q_GLOBAL_STATIC_WITH_ARGS(PredefinedPointPositionVector, DEFAULT_PLACEMENT_ORDER,({ Qgis::LabelPredefinedPointPosition::TopRight, Qgis::LabelPredefinedPointPosition::TopLeft, Qgis::LabelPredefinedPointPosition::BottomRight, Qgis::LabelPredefinedPointPosition::BottomLeft, Qgis::LabelPredefinedPointPosition::MiddleRight, Qgis::LabelPredefinedPointPosition::MiddleLeft, Qgis::LabelPredefinedPointPosition::TopSlightlyRight, Qgis::LabelPredefinedPointPosition::BottomSlightlyRight })) void QgsPalLayerSettings
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
const QgsCoordinateReferenceSystem & crs