32#include <QApplication>
35#include <QFontMetrics>
40#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 )
158 "<b>Ellipse</b>|<b>Circle</b>|<b>SVG</b>]" ), origin )
182 "<b>Buffer</b>|<b>Background</b>]" ), origin )
198 "<b>3</b>=Left|<b>4</b>=Over|<b>5</b>=Right|<br>"
199 "<b>6</b>=Below Left|<b>7</b>=Below|<b>8</b>=Below Right]" ), origin )
219 + QStringLiteral(
"[<b>TL</b>=Top left|<b>TSL</b>=Top, slightly left|<b>T</b>=Top middle|<br>"
220 "<b>TSR</b>=Top, slightly right|<b>TR</b>=Top right|<br>"
221 "<b>L</b>=Left|<b>R</b>=Right|<br>"
222 "<b>BL</b>=Bottom left|<b>BSL</b>=Bottom, slightly left|<b>B</b>=Bottom middle|<br>"
223 "<b>BSR</b>=Bottom, slightly right|<b>BR</b>=Bottom right]" ), origin )
227 + QStringLiteral(
"[<b>OL</b>=On line|<b>AL</b>=Above line|<b>BL</b>=Below line|<br>"
228 "<b>LO</b>=Respect line orientation]" ), origin )
237 "<b>Half</b>|<b>Cap</b>|<b>Top</b>]" ), origin )
262 : predefinedPositionOrder( *DEFAULT_PLACEMENT_ORDER() )
265 initPropertyDefinitions();
274 , mDataDefinedProperties( s.mDataDefinedProperties )
309 mPolygonPlacementFlags = s.mPolygonPlacementFlags;
325 mRotationUnit = s.mRotationUnit;
346 mDataDefinedProperties = s.mDataDefinedProperties;
348 mCallout.reset( s.mCallout ? s.mCallout->clone() :
nullptr );
350 mPlacementSettings = s.mPlacementSettings;
351 mLineSettings = s.mLineSettings;
352 mObstacleSettings = s.mObstacleSettings;
353 mThinningSettings = s.mThinningSettings;
360 mLegendString = s.mLegendString;
362 mUnplacedVisibility = s.mUnplacedVisibility;
412 for (
const QString &name : referencedColumns )
414 attributeNames.insert( name );
473 for (
const QString &name : referencedColumns )
475 attributeNames.insert( name );
482 const auto referencedColumns = mCallout->referencedFields( context );
483 for (
const QString &name : referencedColumns )
485 attributeNames.insert( name );
494 QSet<QString> referenced;
522 referenced.unite( mCallout->referencedFields( context ) );
530 if ( mRenderStarted )
532 qWarning(
"Start render called for when a previous render was already underway!!" );
559 mCallout->startRender( context );
562 mRenderStarted =
true;
567 if ( !mRenderStarted )
569 qWarning(
"Stop render called for QgsPalLayerSettings without a startRender call!" );
575 mCallout->stopRender( context );
578 mRenderStarted =
false;
588 if ( mRenderStarted )
590 qWarning(
"stopRender was not called on QgsPalLayerSettings object!" );
601 initPropertyDefinitions();
602 return *sPropertyDefinitions();
616 return mRotationUnit;
621 mRotationUnit = angleUnit;
627 QString newValue = value;
628 if ( !value.isEmpty() && !value.contains( QLatin1String(
"~~" ) ) )
631 values << QStringLiteral(
"1" );
632 values << QStringLiteral(
"0" );
635 newValue = values.join( QLatin1String(
"~~" ) );
643 QString newPropertyName =
"labeling/dataDefined/" + sPropertyDefinitions()->value( p ).name();
644 QVariant newPropertyField = layer->
customProperty( newPropertyName, QVariant() );
646 if ( !newPropertyField.isValid() )
649 QString ddString = newPropertyField.toString();
651 if ( !ddString.isEmpty() && ddString != QLatin1String(
"0~~0~~~~" ) )
655 QStringList ddv = newStyleString.split( QStringLiteral(
"~~" ) );
657 bool active = ddv.at( 0 ).toInt();
658 if ( ddv.at( 1 ).toInt() )
674void QgsPalLayerSettings::readOldDataDefinedPropertyMap(
QgsVectorLayer *layer, QDomElement *parentElem )
676 if ( !layer && !parentElem )
681 QgsPropertiesDefinition::const_iterator i = sPropertyDefinitions()->constBegin();
682 for ( ; i != sPropertyDefinitions()->constEnd(); ++i )
687 readOldDataDefinedProperty( layer,
static_cast< Property >( i.key() ) );
689 else if ( parentElem )
692 QDomElement e = parentElem->firstChildElement( i.value().name() );
695 bool active = e.attribute( QStringLiteral(
"active" ) ).compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0;
696 bool isExpression = e.attribute( QStringLiteral(
"useExpr" ) ).compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0;
710void QgsPalLayerSettings::readFromLayerCustomProperties(
QgsVectorLayer *layer )
712 if ( layer->
customProperty( QStringLiteral(
"labeling" ) ).toString() != QLatin1String(
"pal" ) )
714 if ( layer->
geometryType() == Qgis::GeometryType::Point )
719 if ( layer->
geometryType() == Qgis::GeometryType::Polygon )
737 QDomDocument doc( QStringLiteral(
"substitutions" ) );
738 doc.setContent( layer->
customProperty( QStringLiteral(
"labeling/substitutions" ) ).toString() );
739 QDomElement replacementElem = doc.firstChildElement( QStringLiteral(
"substitutions" ) );
760 mLineSettings.
setPlacementFlags(
static_cast< QgsLabeling::LinePlacementFlags
>( layer->
customProperty( QStringLiteral(
"labeling/placementFlags" ) ).toUInt() ) );
768 distUnits = layer->
customProperty( QStringLiteral(
"labeling/distInMapUnits" ) ).toBool() ? Qgis::RenderUnit::MapUnits : Qgis::RenderUnit::Millimeters;
769 if ( layer->
customProperty( QStringLiteral(
"labeling/distMapUnitScale" ) ).toString().isEmpty() )
772 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/distMapUnitMinScale" ), 0.0 ).toDouble();
774 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/distMapUnitMaxScale" ), 0.0 ).toDouble();
785 if ( layer->
customProperty( QStringLiteral(
"labeling/labelOffsetInMapUnits" ), QVariant(
true ) ).toBool() )
790 if ( layer->
customProperty( QStringLiteral(
"labeling/labelOffsetMapUnitScale" ) ).toString().isEmpty() )
793 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/labelOffsetMapUnitMinScale" ), 0.0 ).toDouble();
795 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/labelOffsetMapUnitMaxScale" ), 0.0 ).toDouble();
803 QVariant tempAngle = layer->
customProperty( QStringLiteral(
"labeling/angleOffset" ), QVariant() );
804 if ( tempAngle.isValid() )
806 double oldAngle = layer->
customProperty( QStringLiteral(
"labeling/angleOffset" ), QVariant( 0.0 ) ).toDouble();
815 mRotationUnit = layer->
customEnumProperty( QStringLiteral(
"labeling/rotationUnit" ), Qgis::AngleUnit::Degrees );
820 switch ( layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceUnit" ), QVariant( 1 ) ).toUInt() )
835 if ( layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceMapUnitScale" ) ).toString().isEmpty() )
838 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceMapUnitMinScale" ), 0.0 ).toDouble();
840 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceMapUnitMaxScale" ), 0.0 ).toDouble();
849 double scalemn = layer->
customProperty( QStringLiteral(
"labeling/scaleMin" ), QVariant( 0 ) ).toDouble();
850 double scalemx = layer->
customProperty( QStringLiteral(
"labeling/scaleMax" ), QVariant( 0 ) ).toDouble();
853 QVariant scalevis = layer->
customProperty( QStringLiteral(
"labeling/scaleVisibility" ), QVariant() );
854 if ( scalevis.isValid() )
860 else if ( scalemn > 0 || scalemx > 0 )
876 if ( layer->
customProperty( QStringLiteral(
"labeling/displayAll" ), QVariant(
false ) ).toBool() )
894 mObstacleSettings.
setFactor( layer->
customProperty( QStringLiteral(
"labeling/obstacleFactor" ), QVariant( 1.0 ) ).toDouble() );
896 zIndex = layer->
customProperty( QStringLiteral(
"labeling/zIndex" ), QVariant( 0.0 ) ).toDouble();
898 mDataDefinedProperties.
clear();
899 if ( layer->
customProperty( QStringLiteral(
"labeling/ddProperties" ) ).isValid() )
901 QDomDocument doc( QStringLiteral(
"dd" ) );
902 doc.setContent( layer->
customProperty( QStringLiteral(
"labeling/ddProperties" ) ).toString() );
903 QDomElement elem = doc.firstChildElement( QStringLiteral(
"properties" ) );
904 mDataDefinedProperties.
readXml( elem, *sPropertyDefinitions() );
909 readOldDataDefinedPropertyMap( layer,
nullptr );
953 QDomElement textStyleElem = elem.firstChildElement( QStringLiteral(
"text-style" ) );
954 fieldName = textStyleElem.attribute( QStringLiteral(
"fieldName" ) );
955 isExpression = textStyleElem.attribute( QStringLiteral(
"isExpression" ) ).toInt();
957 mFormat.
readXml( elem, context );
959 previewBkgrdColor = QColor( textStyleElem.attribute( QStringLiteral(
"previewBkgrdColor" ), QStringLiteral(
"#ffffff" ) ) );
962 useSubstitutions = textStyleElem.attribute( QStringLiteral(
"useSubstitutions" ) ).toInt();
963 mLegendString = textStyleElem.attribute( QStringLiteral(
"legendString" ), QObject::tr(
"Aa" ) );
966 QDomElement textFormatElem = elem.firstChildElement( QStringLiteral(
"text-format" ) );
967 wrapChar = textFormatElem.attribute( QStringLiteral(
"wrapChar" ) );
968 autoWrapLength = textFormatElem.attribute( QStringLiteral(
"autoWrapLength" ), QStringLiteral(
"0" ) ).toInt();
969 useMaxLineLengthForAutoWrap = textFormatElem.attribute( QStringLiteral(
"useMaxLineLengthForAutoWrap" ), QStringLiteral(
"1" ) ).toInt();
970 multilineAlign =
static_cast< Qgis::LabelMultiLineAlignment >( textFormatElem.attribute( QStringLiteral(
"multilineAlign" ), QString::number(
static_cast< int >( Qgis::LabelMultiLineAlignment::FollowPlacement ) ) ).toUInt() );
971 mLineSettings.
setAddDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"addDirectionSymbol" ) ).toInt() );
972 mLineSettings.
setLeftDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"leftDirectionSymbol" ), QStringLiteral(
"<" ) ) );
973 mLineSettings.
setRightDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"rightDirectionSymbol" ), QStringLiteral(
">" ) ) );
974 mLineSettings.
setReverseDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"reverseDirectionSymbol" ) ).toInt() );
976 formatNumbers = textFormatElem.attribute( QStringLiteral(
"formatNumbers" ) ).toInt();
977 decimals = textFormatElem.attribute( QStringLiteral(
"decimals" ) ).toInt();
978 plusSign = textFormatElem.attribute( QStringLiteral(
"plussign" ) ).toInt();
981 QDomElement placementElem = elem.firstChildElement( QStringLiteral(
"placement" ) );
983 mLineSettings.
setPlacementFlags(
static_cast< QgsLabeling::LinePlacementFlags
>( placementElem.attribute( QStringLiteral(
"placementFlags" ) ).toUInt() ) );
984 mPolygonPlacementFlags =
static_cast< QgsLabeling::PolygonPlacementFlags
>( placementElem.attribute( QStringLiteral(
"polygonPlacementFlags" ), QString::number(
static_cast< int >( QgsLabeling::PolygonPlacementFlag::AllowPlacementInsideOfPolygon ) ) ).toInt() );
986 centroidWhole = placementElem.attribute( QStringLiteral(
"centroidWhole" ), QStringLiteral(
"0" ) ).toInt();
987 centroidInside = placementElem.attribute( QStringLiteral(
"centroidInside" ), QStringLiteral(
"0" ) ).toInt();
991 fitInPolygonOnly = placementElem.attribute( QStringLiteral(
"fitInPolygonOnly" ), QStringLiteral(
"0" ) ).toInt();
992 dist = placementElem.attribute( QStringLiteral(
"dist" ) ).toDouble();
993 if ( !placementElem.hasAttribute( QStringLiteral(
"distUnits" ) ) )
995 if ( placementElem.attribute( QStringLiteral(
"distInMapUnits" ) ).toInt() )
998 distUnits = Qgis::RenderUnit::Millimeters;
1004 if ( !placementElem.hasAttribute( QStringLiteral(
"distMapUnitScale" ) ) )
1007 double oldMin = placementElem.attribute( QStringLiteral(
"distMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
1009 double oldMax = placementElem.attribute( QStringLiteral(
"distMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
1017 quadOffset =
static_cast< Qgis::LabelQuadrantPosition >( placementElem.attribute( QStringLiteral(
"quadOffset" ), QString::number(
static_cast< int >( Qgis::LabelQuadrantPosition::Over ) ) ).toUInt() );
1018 xOffset = placementElem.attribute( QStringLiteral(
"xOffset" ), QStringLiteral(
"0" ) ).toDouble();
1019 yOffset = placementElem.attribute( QStringLiteral(
"yOffset" ), QStringLiteral(
"0" ) ).toDouble();
1020 if ( !placementElem.hasAttribute( QStringLiteral(
"offsetUnits" ) ) )
1022 offsetUnits = placementElem.attribute( QStringLiteral(
"labelOffsetInMapUnits" ), QStringLiteral(
"1" ) ).toInt() ? Qgis::RenderUnit::MapUnits : Qgis::RenderUnit::Millimeters;
1028 if ( !placementElem.hasAttribute( QStringLiteral(
"labelOffsetMapUnitScale" ) ) )
1031 double oldMin = placementElem.attribute( QStringLiteral(
"labelOffsetMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
1033 double oldMax = placementElem.attribute( QStringLiteral(
"labelOffsetMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
1041 if ( placementElem.hasAttribute( QStringLiteral(
"angleOffset" ) ) )
1043 double oldAngle = placementElem.attribute( QStringLiteral(
"angleOffset" ), QStringLiteral(
"0" ) ).toDouble();
1048 angleOffset = placementElem.attribute( QStringLiteral(
"rotationAngle" ), QStringLiteral(
"0" ) ).toDouble();
1051 preserveRotation = placementElem.attribute( QStringLiteral(
"preserveRotation" ), QStringLiteral(
"1" ) ).toInt();
1053 QString rotationUnitString = placementElem.attribute( QStringLiteral(
"rotationUnit" ),
qgsEnumValueToKey( Qgis::AngleUnit::Degrees ) );
1054 if ( rotationUnitString.startsWith( QLatin1String(
"Angle" ) ) )
1057 rotationUnitString = rotationUnitString.mid( 5 );
1060 mRotationUnit =
qgsEnumKeyToValue( rotationUnitString, Qgis::AngleUnit::Degrees );
1062 maxCurvedCharAngleIn = placementElem.attribute( QStringLiteral(
"maxCurvedCharAngleIn" ), QStringLiteral(
"25" ) ).toDouble();
1063 maxCurvedCharAngleOut = placementElem.attribute( QStringLiteral(
"maxCurvedCharAngleOut" ), QStringLiteral(
"-25" ) ).toDouble();
1064 priority = placementElem.attribute( QStringLiteral(
"priority" ) ).toInt();
1065 repeatDistance = placementElem.attribute( QStringLiteral(
"repeatDistance" ), QStringLiteral(
"0" ) ).toDouble();
1066 if ( !placementElem.hasAttribute( QStringLiteral(
"repeatDistanceUnits" ) ) )
1069 switch ( placementElem.attribute( QStringLiteral(
"repeatDistanceUnit" ), QString::number( 1 ) ).toUInt() )
1089 if ( !placementElem.hasAttribute( QStringLiteral(
"repeatDistanceMapUnitScale" ) ) )
1092 double oldMin = placementElem.attribute( QStringLiteral(
"repeatDistanceMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
1094 double oldMax = placementElem.attribute( QStringLiteral(
"repeatDistanceMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
1102 mLineSettings.
setOverrunDistance( placementElem.attribute( QStringLiteral(
"overrunDistance" ), QStringLiteral(
"0" ) ).toDouble() );
1105 mLineSettings.
setLineAnchorPercent( placementElem.attribute( QStringLiteral(
"lineAnchorPercent" ), QStringLiteral(
"0.5" ) ).toDouble() );
1111 geometryGenerator = placementElem.attribute( QStringLiteral(
"geometryGenerator" ) );
1114 QString geometryTypeKey = placementElem.attribute( QStringLiteral(
"geometryGeneratorType" ) );
1116 if ( geometryTypeKey.endsWith( QLatin1String(
"Geometry" ) ) )
1117 geometryTypeKey.chop( 8 );
1122 QString layerTypeKey = placementElem.attribute( QStringLiteral(
"layerType" ) );
1124 if ( layerTypeKey.endsWith( QLatin1String(
"Geometry" ) ) )
1125 layerTypeKey.chop( 8 );
1130 mPlacementSettings.
setAllowDegradedPlacement( placementElem.attribute( QStringLiteral(
"allowDegraded" ), QStringLiteral(
"0" ) ).toInt() );
1133 QDomElement renderingElem = elem.firstChildElement( QStringLiteral(
"rendering" ) );
1135 drawLabels = renderingElem.attribute( QStringLiteral(
"drawLabels" ), QStringLiteral(
"1" ) ).toInt();
1137 maximumScale = renderingElem.attribute( QStringLiteral(
"scaleMin" ), QStringLiteral(
"0" ) ).toDouble();
1138 minimumScale = renderingElem.attribute( QStringLiteral(
"scaleMax" ), QStringLiteral(
"0" ) ).toDouble();
1139 scaleVisibility = renderingElem.attribute( QStringLiteral(
"scaleVisibility" ) ).toInt();
1141 fontLimitPixelSize = renderingElem.attribute( QStringLiteral(
"fontLimitPixelSize" ), QStringLiteral(
"0" ) ).toInt();
1142 fontMinPixelSize = renderingElem.attribute( QStringLiteral(
"fontMinPixelSize" ), QStringLiteral(
"0" ) ).toInt();
1143 fontMaxPixelSize = renderingElem.attribute( QStringLiteral(
"fontMaxPixelSize" ), QStringLiteral(
"10000" ) ).toInt();
1145 if ( placementElem.hasAttribute( QStringLiteral(
"overlapHandling" ) ) )
1152 if ( renderingElem.attribute( QStringLiteral(
"displayAll" ), QStringLiteral(
"0" ) ).toInt() )
1163 upsidedownLabels =
static_cast< Qgis::UpsideDownLabelHandling >( renderingElem.attribute( QStringLiteral(
"upsidedownLabels" ), QString::number(
static_cast< int >( Qgis::UpsideDownLabelHandling::FlipUpsideDownLabels ) ) ).toUInt() );
1165 labelPerPart = renderingElem.attribute( QStringLiteral(
"labelPerPart" ) ).toInt();
1166 mLineSettings.
setMergeLines( renderingElem.attribute( QStringLiteral(
"mergeLines" ) ).toInt() );
1167 mThinningSettings.
setMinimumFeatureSize( renderingElem.attribute( QStringLiteral(
"minFeatureSize" ) ).toDouble() );
1168 mThinningSettings.
setLimitNumberLabelsEnabled( renderingElem.attribute( QStringLiteral(
"limitNumLabels" ), QStringLiteral(
"0" ) ).toInt() );
1169 mThinningSettings.
setMaximumNumberLabels( renderingElem.attribute( QStringLiteral(
"maxNumLabels" ), QStringLiteral(
"2000" ) ).toInt() );
1170 mObstacleSettings.
setIsObstacle( renderingElem.attribute( QStringLiteral(
"obstacle" ), QStringLiteral(
"1" ) ).toInt() );
1171 mObstacleSettings.
setFactor( renderingElem.attribute( QStringLiteral(
"obstacleFactor" ), QStringLiteral(
"1" ) ).toDouble() );
1173 zIndex = renderingElem.attribute( QStringLiteral(
"zIndex" ), QStringLiteral(
"0.0" ) ).toDouble();
1176 QDomElement ddElem = elem.firstChildElement( QStringLiteral(
"dd_properties" ) );
1177 if ( !ddElem.isNull() )
1179 mDataDefinedProperties.
readXml( ddElem, *sPropertyDefinitions() );
1184 mDataDefinedProperties.
clear();
1185 QDomElement ddElem = elem.firstChildElement( QStringLiteral(
"data-defined" ) );
1186 readOldDataDefinedPropertyMap(
nullptr, &ddElem );
1227 const QString calloutType = elem.attribute( QStringLiteral(
"calloutType" ) );
1228 if ( calloutType.isEmpty() )
1240 QDomElement textStyleElem = mFormat.
writeXml( doc, context );
1243 textStyleElem.setAttribute( QStringLiteral(
"fieldName" ),
fieldName );
1244 textStyleElem.setAttribute( QStringLiteral(
"isExpression" ),
isExpression );
1245 QDomElement replacementElem = doc.createElement( QStringLiteral(
"substitutions" ) );
1247 textStyleElem.appendChild( replacementElem );
1248 textStyleElem.setAttribute( QStringLiteral(
"useSubstitutions" ),
useSubstitutions );
1249 textStyleElem.setAttribute( QStringLiteral(
"legendString" ), mLegendString );
1252 QDomElement textFormatElem = doc.createElement( QStringLiteral(
"text-format" ) );
1253 textFormatElem.setAttribute( QStringLiteral(
"wrapChar" ),
wrapChar );
1254 textFormatElem.setAttribute( QStringLiteral(
"autoWrapLength" ),
autoWrapLength );
1256 textFormatElem.setAttribute( QStringLiteral(
"multilineAlign" ),
static_cast< unsigned int >(
multilineAlign ) );
1257 textFormatElem.setAttribute( QStringLiteral(
"addDirectionSymbol" ), mLineSettings.
addDirectionSymbol() );
1258 textFormatElem.setAttribute( QStringLiteral(
"leftDirectionSymbol" ), mLineSettings.
leftDirectionSymbol() );
1259 textFormatElem.setAttribute( QStringLiteral(
"rightDirectionSymbol" ), mLineSettings.
rightDirectionSymbol() );
1260 textFormatElem.setAttribute( QStringLiteral(
"reverseDirectionSymbol" ), mLineSettings.
reverseDirectionSymbol() );
1261 textFormatElem.setAttribute( QStringLiteral(
"placeDirectionSymbol" ),
static_cast< unsigned int >( mLineSettings.
directionSymbolPlacement() ) );
1262 textFormatElem.setAttribute( QStringLiteral(
"formatNumbers" ),
formatNumbers );
1263 textFormatElem.setAttribute( QStringLiteral(
"decimals" ),
decimals );
1264 textFormatElem.setAttribute( QStringLiteral(
"plussign" ),
plusSign );
1267 QDomElement placementElem = doc.createElement( QStringLiteral(
"placement" ) );
1268 placementElem.setAttribute( QStringLiteral(
"placement" ),
static_cast< int >(
placement ) );
1269 placementElem.setAttribute( QStringLiteral(
"polygonPlacementFlags" ),
static_cast< int >( mPolygonPlacementFlags ) );
1270 placementElem.setAttribute( QStringLiteral(
"placementFlags" ),
static_cast< unsigned int >( mLineSettings.
placementFlags() ) );
1271 placementElem.setAttribute( QStringLiteral(
"centroidWhole" ),
centroidWhole );
1272 placementElem.setAttribute( QStringLiteral(
"centroidInside" ),
centroidInside );
1274 placementElem.setAttribute( QStringLiteral(
"fitInPolygonOnly" ),
fitInPolygonOnly );
1275 placementElem.setAttribute( QStringLiteral(
"dist" ),
dist );
1278 placementElem.setAttribute( QStringLiteral(
"offsetType" ),
static_cast< unsigned int >(
offsetType ) );
1279 placementElem.setAttribute( QStringLiteral(
"quadOffset" ),
static_cast< unsigned int >(
quadOffset ) );
1280 placementElem.setAttribute( QStringLiteral(
"xOffset" ),
xOffset );
1281 placementElem.setAttribute( QStringLiteral(
"yOffset" ),
yOffset );
1284 placementElem.setAttribute( QStringLiteral(
"rotationAngle" ),
angleOffset );
1285 placementElem.setAttribute( QStringLiteral(
"preserveRotation" ),
preserveRotation );
1288 const QString rotationUnitString = QStringLiteral(
"Angle" ) +
qgsEnumValueToKey( mRotationUnit );
1289 placementElem.setAttribute( QStringLiteral(
"rotationUnit" ), rotationUnitString );
1293 placementElem.setAttribute( QStringLiteral(
"priority" ),
priority );
1294 placementElem.setAttribute( QStringLiteral(
"repeatDistance" ),
repeatDistance );
1297 placementElem.setAttribute( QStringLiteral(
"overrunDistance" ), mLineSettings.
overrunDistance() );
1300 placementElem.setAttribute( QStringLiteral(
"lineAnchorPercent" ), mLineSettings.
lineAnchorPercent() );
1301 placementElem.setAttribute( QStringLiteral(
"lineAnchorType" ),
static_cast< int >( mLineSettings.
anchorType() ) );
1302 placementElem.setAttribute( QStringLiteral(
"lineAnchorClipping" ),
static_cast< int >( mLineSettings.
anchorClipping() ) );
1305 placementElem.setAttribute( QStringLiteral(
"geometryGenerator" ),
geometryGenerator );
1312 placementElem.setAttribute( QStringLiteral(
"allowDegraded" ), mPlacementSettings.
allowDegradedPlacement() ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
1315 QDomElement renderingElem = doc.createElement( QStringLiteral(
"rendering" ) );
1316 renderingElem.setAttribute( QStringLiteral(
"drawLabels" ),
drawLabels );
1317 renderingElem.setAttribute( QStringLiteral(
"scaleVisibility" ),
scaleVisibility );
1318 renderingElem.setAttribute( QStringLiteral(
"scaleMin" ),
maximumScale );
1319 renderingElem.setAttribute( QStringLiteral(
"scaleMax" ),
minimumScale );
1320 renderingElem.setAttribute( QStringLiteral(
"fontLimitPixelSize" ),
fontLimitPixelSize );
1321 renderingElem.setAttribute( QStringLiteral(
"fontMinPixelSize" ),
fontMinPixelSize );
1322 renderingElem.setAttribute( QStringLiteral(
"fontMaxPixelSize" ),
fontMaxPixelSize );
1323 renderingElem.setAttribute( QStringLiteral(
"upsidedownLabels" ),
static_cast< unsigned int >(
upsidedownLabels ) );
1325 renderingElem.setAttribute( QStringLiteral(
"labelPerPart" ),
labelPerPart );
1326 renderingElem.setAttribute( QStringLiteral(
"mergeLines" ), mLineSettings.
mergeLines() );
1327 renderingElem.setAttribute( QStringLiteral(
"minFeatureSize" ), mThinningSettings.
minimumFeatureSize() );
1329 renderingElem.setAttribute( QStringLiteral(
"maxNumLabels" ), mThinningSettings.
maximumNumberLabels() );
1330 renderingElem.setAttribute( QStringLiteral(
"obstacle" ), mObstacleSettings.
isObstacle() );
1331 renderingElem.setAttribute( QStringLiteral(
"obstacleFactor" ), mObstacleSettings.
factor() );
1332 renderingElem.setAttribute( QStringLiteral(
"obstacleType" ),
static_cast< unsigned int >( mObstacleSettings.
type() ) );
1333 renderingElem.setAttribute( QStringLiteral(
"zIndex" ),
zIndex );
1334 renderingElem.setAttribute( QStringLiteral(
"unplacedVisibility" ),
static_cast< int >( mUnplacedVisibility ) );
1336 QDomElement ddElem = doc.createElement( QStringLiteral(
"dd_properties" ) );
1337 mDataDefinedProperties.
writeXml( ddElem, *sPropertyDefinitions() );
1339 QDomElement elem = doc.createElement( QStringLiteral(
"settings" ) );
1340 elem.appendChild( textStyleElem );
1341 elem.appendChild( textFormatElem );
1342 elem.appendChild( placementElem );
1343 elem.appendChild( renderingElem );
1344 elem.appendChild( ddElem );
1348 elem.setAttribute( QStringLiteral(
"calloutType" ), mCallout->type() );
1349 mCallout->saveProperties( doc, elem, context );
1364 QPixmap pixmap( size );
1365 pixmap.fill( Qt::transparent );
1367 painter.begin( &pixmap );
1369 painter.setRenderHint( QPainter::Antialiasing );
1371 QRect rect( 0, 0, size.width(), size.height() );
1374 painter.setPen( Qt::NoPen );
1376 if ( ( background1.lightnessF() < 0.7 ) )
1378 background1 = background1.darker( 125 );
1382 background1 = background1.lighter( 125 );
1385 QLinearGradient linearGrad( QPointF( 0, 0 ), QPointF( 0, rect.height() ) );
1386 linearGrad.setColorAt( 0, background1 );
1387 linearGrad.setColorAt( 1, background2 );
1388 painter.setBrush( QBrush( linearGrad ) );
1389 if ( size.width() > 30 )
1391 painter.drawRoundedRect( rect, 6, 6 );
1396 painter.drawRect( rect );
1398 painter.setBrush( Qt::NoBrush );
1399 painter.setPen( Qt::NoPen );
1408 QWidget *activeWindow = QApplication::activeWindow();
1409 const double logicalDpiX = activeWindow && activeWindow->screen() ? activeWindow->screen()->logicalDotsPerInchX() : 96.0;
1418 xtrans = tempFormat.
buffer().
sizeUnit() == Qgis::RenderUnit::Percentage
1419 ? fontSize * tempFormat.
buffer().
size() / 100
1424 double ytrans = 0.0;
1426 ytrans = std::max( ytrans, tempFormat.
buffer().
sizeUnit() == Qgis::RenderUnit::Percentage
1427 ? fontSize * tempFormat.
buffer().
size() / 100
1432 const QStringList text = QStringList() << ( previewText.isEmpty() ? settings.
legendString() : previewText );
1434 QRectF textRect = rect;
1435 textRect.setLeft( xtrans + padding );
1436 textRect.setWidth( rect.width() - xtrans - 2 * padding );
1438 if ( textRect.width() > 2000 )
1439 textRect.setWidth( 2000 - 2 * padding );
1441 const double bottom = textRect.height() / 2 + textHeight / 2;
1442 textRect.setTop( bottom - textHeight );
1443 textRect.setBottom( bottom );
1454 QRectF labelRect( textRect.left() + ( textRect.width() - textWidth ) / 2.0, textRect.top(), textWidth, textRect.height() );
1461 if ( size.width() > 30 )
1466 rect.width() - iconWidth * 3, rect.height() - iconWidth * 3,
1467 iconWidth * 2, iconWidth * 2 ), Qt::AlignRight | Qt::AlignBottom );
1471 painter.setBrush( Qt::NoBrush );
1473 if ( size.width() > 30 )
1475 painter.drawRoundedRect( rect, 6, 6 );
1480 painter.drawRect( rect );
1489 return mUnplacedVisibility;
1494 mUnplacedVisibility = visibility;
1499 return QgsPalLabeling::checkMinimumSizeMM(
ct, geom, minSize );
1502void QgsPalLayerSettings::calculateLabelSize(
const QFontMetricsF *fm,
const QString &text,
double &labelX,
double &labelY,
const QgsFeature *f,
QgsRenderContext *context,
double *rotatedLabelX,
double *rotatedLabelY,
QgsTextDocument *document,
QgsTextDocumentMetrics *documentMetrics, QRectF *outerBounds )
1509 QString textCopy( text );
1512 std::unique_ptr< QgsRenderContext > scopedRc;
1517 scopedRc->expressionContext().setFeature( *f );
1633 if ( wrapchr.isEmpty() )
1635 wrapchr = QStringLiteral(
"\n" );
1640 && ( !leftDirSymb.isEmpty() || !rightDirSymb.isEmpty() ) )
1642 QString dirSym = leftDirSymb;
1644 if ( fm->horizontalAdvance( rightDirSymb ) > fm->horizontalAdvance( dirSym ) )
1645 dirSym = rightDirSymb;
1647 switch ( placeDirSymb )
1650 textCopy.append( dirSym );
1655 textCopy.prepend( dirSym + QStringLiteral(
"\n" ) );
1660 double w = 0.0, h = 0.0, rw = 0.0, rh = 0.0;
1661 double labelHeight = fm->ascent() + fm->descent();
1668 const QSizeF size = documentMetrics->
documentSize( Qgis::TextLayoutMode::Labeling, orientation );
1675 const int lines = multiLineSplit.size();
1679 switch ( orientation )
1681 case Qgis::TextOrientation::Horizontal:
1683 h += fm->height() +
static_cast< double >( ( lines - 1 ) * ( mFormat.
lineHeightUnit() == Qgis::RenderUnit::Percentage ? ( labelHeight * multilineH ) : lineHeightPainterUnits ) );
1685 for (
const QString &line : std::as_const( multiLineSplit ) )
1687 w = std::max( w, fm->horizontalAdvance( line ) );
1692 case Qgis::TextOrientation::Vertical:
1694 double letterSpacing = mFormat.
scaledFont( *context ).letterSpacing();
1695 double labelWidth = fm->maxWidth();
1696 w = labelWidth + ( lines - 1 ) * ( mFormat.
lineHeightUnit() == Qgis::RenderUnit::Percentage ? ( labelWidth * multilineH ) : lineHeightPainterUnits );
1698 int maxLineLength = 0;
1699 for (
const QString &line : std::as_const( multiLineSplit ) )
1701 maxLineLength = std::max( maxLineLength,
static_cast<int>( line.length() ) );
1703 h = fm->ascent() * maxLineLength + ( maxLineLength - 1 ) * letterSpacing;
1707 case Qgis::TextOrientation::RotationBased:
1709 double widthHorizontal = 0.0;
1710 for (
const QString &line : std::as_const( multiLineSplit ) )
1712 widthHorizontal = std::max( w, fm->horizontalAdvance( line ) );
1715 double widthVertical = 0.0;
1716 double letterSpacing = mFormat.
scaledFont( *context ).letterSpacing();
1717 double labelWidth = fm->maxWidth();
1718 widthVertical = labelWidth + ( lines - 1 ) * ( mFormat.
lineHeightUnit() == Qgis::RenderUnit::Percentage ? ( labelWidth * multilineH ) : lineHeightPainterUnits );
1720 double heightHorizontal = 0.0;
1721 heightHorizontal += fm->height() +
static_cast< double >( ( lines - 1 ) * ( mFormat.
lineHeightUnit() == Qgis::RenderUnit::Percentage ? ( labelHeight * multilineH ) : lineHeightPainterUnits ) );
1723 double heightVertical = 0.0;
1724 int maxLineLength = 0;
1725 for (
const QString &line : std::as_const( multiLineSplit ) )
1727 maxLineLength = std::max( maxLineLength,
static_cast<int>( line.length() ) );
1729 heightVertical = fm->ascent() * maxLineLength + ( maxLineLength - 1 ) * letterSpacing;
1731 w = widthHorizontal;
1732 rw = heightVertical;
1733 h = heightHorizontal;
1742 labelX = std::fabs( ptSize.
x() -
ptZero.
x() );
1743 labelY = std::fabs( ptSize.
y() -
ptZero.
y() );
1748 if ( rotatedLabelX && rotatedLabelY )
1750 *rotatedLabelX = rw * uPP;
1751 *rotatedLabelY = rh * uPP;
1755 if ( outerBounds && documentMetrics )
1757 const QRectF outerBoundsPixels = documentMetrics->
outerBounds( Qgis::TextLayoutMode::Labeling, orientation );
1759 *outerBounds = QRectF( outerBoundsPixels.left() * uPP,
1760 outerBoundsPixels.top() * uPP,
1761 outerBoundsPixels.width() * uPP,
1762 outerBoundsPixels.height() * uPP );
1777 bool isObstacle = mObstacleSettings.
isObstacle();
1785 return registerObstacleFeature( f, context, obstacleGeometry );
1800 if ( obstacleGeometry.
isNull() )
1813 dataDefinedValues.clear();
1830 if ( useScaleVisibility )
1843 maxScale = 1 / std::fabs( maxScale );
1862 minScale = 1 / std::fabs( minScale );
1871 QFont labelFont = mFormat.
font();
1879 QString units = exprVal.toString();
1880 if ( !units.isEmpty() )
1890 double fontSize = mFormat.
size();
1896 if ( fontSize <= 0.0 )
1903 if ( fontPixelSize < 1 )
1907 labelFont.setPixelSize( fontPixelSize );
1912 if ( fontunits == Qgis::RenderUnit::MapUnits )
1919 if ( fontMinPixel > labelFont.pixelSize() || labelFont.pixelSize() > fontMaxPixel )
1931 labelFont.setCapitalization( QFont::MixedCase );
1933 parseTextStyle( labelFont, fontunits, context );
1936 parseTextFormatting( context );
1937 parseTextBuffer( context );
1938 parseTextMask( context );
1939 parseShapeBackground( context );
1940 parseDropShadow( context );
1988 QString fcase = exprVal.toString().trimmed();
1989 QgsDebugMsgLevel( QStringLiteral(
"exprVal FontCase:%1" ).arg( fcase ), 4 );
1991 if ( !fcase.isEmpty() )
1993 if ( fcase.compare( QLatin1String(
"NoChange" ), Qt::CaseInsensitive ) == 0 )
1997 else if ( fcase.compare( QLatin1String(
"Upper" ), Qt::CaseInsensitive ) == 0 )
2001 else if ( fcase.compare( QLatin1String(
"Lower" ), Qt::CaseInsensitive ) == 0 )
2005 else if ( fcase.compare( QLatin1String(
"Capitalize" ), Qt::CaseInsensitive ) == 0 )
2009 else if ( fcase.compare( QLatin1String(
"Title" ), Qt::CaseInsensitive ) == 0 )
2013#if defined(HAS_KDE_QT5_SMALL_CAPS_FIX) || QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)
2014 else if ( fcase.compare( QLatin1String(
"SmallCaps" ), Qt::CaseInsensitive ) == 0 )
2018 else if ( fcase.compare( QLatin1String(
"AllSmallCaps" ), Qt::CaseInsensitive ) == 0 )
2034 if ( evalFormatNumbers )
2038 if ( decimalPlaces <= 0 )
2044 QVariant textV( labelText );
2046 double d = textV.toDouble( &ok );
2049 QString numberFormat;
2050 if ( d > 0 && signPlus )
2052 numberFormat.append(
'+' );
2054 numberFormat.append(
"%1" );
2055 labelText = numberFormat.arg( d, 0,
'f', decimalPlaces );
2060 std::unique_ptr<QFontMetricsF> labelFontMetrics(
new QFontMetricsF( labelFont ) );
2063 double rotatedLabelX;
2064 double rotatedLabelY;
2069 if (
format().allowHtmlFormatting() && !labelText.isEmpty() )
2073 calculateLabelSize( labelFontMetrics.get(), labelText, labelWidth, labelHeight,
mCurFeat, &context, &rotatedLabelX, &rotatedLabelY, &doc, &documentMetrics, &outerBounds );
2077 calculateLabelSize( labelFontMetrics.get(), labelText, labelWidth, labelHeight,
mCurFeat, &context, &rotatedLabelX, &rotatedLabelY,
nullptr,
nullptr, &outerBounds );
2082 double maxcharanglein = 20.0;
2083 double maxcharangleout = -20.0;
2101 maxcharanglein = std::clamp(
static_cast< double >( maxcharanglePt.x() ), 20.0, 60.0 );
2102 maxcharangleout = std::clamp(
static_cast< double >( maxcharanglePt.y() ), 20.0, 95.0 );
2106 maxcharangleout = -( std::fabs( maxcharangleout ) );
2127 QString
str = exprVal.toString().trimmed();
2130 if ( !
str.isEmpty() )
2132 if (
str.compare( QLatin1String(
"Visible" ), Qt::CaseInsensitive ) == 0 )
2134 wholeCentroid =
false;
2136 else if (
str.compare( QLatin1String(
"Whole" ), Qt::CaseInsensitive ) == 0 )
2138 wholeCentroid =
true;
2152 std::unique_ptr<QgsGeometry> scopedClonedGeom;
2158 geom = simplifier.
simplify( geom );
2171 && geom.
type() == Qgis::GeometryType::Polygon );
2175 bool doClip =
false;
2176 if ( !centroidPoly || !wholeCentroid )
2182 QgsLabeling::PolygonPlacementFlags polygonPlacement = mPolygonPlacementFlags;
2188 if ( dataDefinedOutside.type() == QVariant::String )
2190 const QString value = dataDefinedOutside.toString().trimmed();
2191 if ( value.compare( QLatin1String(
"force" ), Qt::CaseInsensitive ) == 0 )
2194 polygonPlacement &= ~static_cast< int >( QgsLabeling::PolygonPlacementFlag::AllowPlacementInsideOfPolygon );
2195 polygonPlacement |= QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon;
2197 else if ( value.compare( QLatin1String(
"yes" ), Qt::CaseInsensitive ) == 0 )
2200 polygonPlacement |= QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon;
2202 else if ( value.compare( QLatin1String(
"no" ), Qt::CaseInsensitive ) == 0 )
2205 polygonPlacement &= ~static_cast< int >( QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon );
2210 if ( dataDefinedOutside.toBool() )
2213 polygonPlacement |= QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon;
2218 polygonPlacement &= ~static_cast< int >( QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon );
2227 if ( geom.
type() == Qgis::GeometryType::Line )
2244 if ( geom.
type() == Qgis::GeometryType::Polygon && (
fitInPolygonOnly || polygonPlacement & QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon ) )
2246 permissibleZone = geom;
2255 if ( ( geom.
type() == Qgis::GeometryType::Polygon )
2282 double minimumSize = 0.0;
2286 if ( geom.
type() == Qgis::GeometryType::Line && mLineSettings.
mergeLines() )
2292 if ( !checkMinimumSizeMM( context, geom, featureThinningSettings.
minimumFeatureSize() ) )
2297 if ( !geos_geom_clone )
2326 bool layerDefinedRotation =
false;
2327 bool dataDefinedRotation =
false;
2328 double xPos = 0.0, yPos = 0.0,
angle = 0.0;
2329 double quadOffsetX = 0.0, quadOffsetY = 0.0;
2330 double offsetX = 0.0, offsetY = 0.0;
2342 bool ddFixedQuad =
false;
2351 int quadInt = exprVal.toInt( &ok );
2352 if ( ok && 0 <= quadInt && quadInt <= 8 )
2363 case Qgis::LabelQuadrantPosition::AboveLeft:
2367 case Qgis::LabelQuadrantPosition::Above:
2371 case Qgis::LabelQuadrantPosition::AboveRight:
2375 case Qgis::LabelQuadrantPosition::Left:
2379 case Qgis::LabelQuadrantPosition::Right:
2383 case Qgis::LabelQuadrantPosition::BelowLeft:
2387 case Qgis::LabelQuadrantPosition::Below:
2391 case Qgis::LabelQuadrantPosition::BelowRight:
2395 case Qgis::LabelQuadrantPosition::Over:
2422 QString units = exprVal.toString().trimmed();
2423 if ( !units.isEmpty() )
2429 offUnit = decodedUnits;
2444 layerDefinedRotation =
true;
2457 const double rotation = exprVal.toDouble( &ok );
2460 dataDefinedRotation =
true;
2463 Qgis::AngleUnit::Degrees );
2468 angle = ( 360 - rotationDegrees ) * M_PI / 180.0;
2473 bool hasDataDefinedPosition =
false;
2475 bool ddPosition =
false;
2487 bool ddXPos =
false, ddYPos =
false;
2488 xPos = xPosProperty.toDouble( &ddXPos );
2489 yPos = yPosProperty.toDouble( &ddYPos );
2490 if ( ddXPos && ddYPos )
2491 hasDataDefinedPosition =
true;
2502 if ( pointPosProperty.userType() == QMetaType::type(
"QgsReferencedGeometry" ) )
2507 if ( !referencedGeometryPoint.
isNull()
2511 else if ( pointPosProperty.userType() == QMetaType::type(
"QgsGeometry" ) )
2518 hasDataDefinedPosition =
true;
2529 if ( hasDataDefinedPosition )
2532 if ( layerDefinedRotation && !dataDefinedRotation )
2543 QString haliString = exprVal.toString();
2544 if ( haliString.compare( QLatin1String(
"Center" ), Qt::CaseInsensitive ) == 0 )
2546 xdiff -= labelWidth / 2.0;
2548 else if ( haliString.compare( QLatin1String(
"Right" ), Qt::CaseInsensitive ) == 0 )
2550 xdiff -= labelWidth;
2561 QString valiString = exprVal.toString();
2562 if ( valiString.compare( QLatin1String(
"Bottom" ), Qt::CaseInsensitive ) != 0 )
2564 if ( valiString.compare( QLatin1String(
"Top" ), Qt::CaseInsensitive ) == 0 )
2566 ydiff -= labelHeight;;
2570 double descentRatio = labelFontMetrics->descent() / labelFontMetrics->height();
2571 if ( valiString.compare( QLatin1String(
"Base" ), Qt::CaseInsensitive ) == 0 )
2573 ydiff -= labelHeight * descentRatio;
2577 double capHeightRatio = ( labelFontMetrics->boundingRect(
'H' ).height() + 1 + labelFontMetrics->descent() ) / labelFontMetrics->height();
2578 ydiff -= labelHeight * capHeightRatio;
2579 if ( valiString.compare( QLatin1String(
"Half" ), Qt::CaseInsensitive ) == 0 )
2581 ydiff += labelHeight * ( capHeightRatio - descentRatio ) / 2.0;
2589 if ( dataDefinedRotation )
2592 double xd = xdiff * std::cos(
angle ) - ydiff * std::sin(
angle );
2593 double yd = xdiff * std::sin(
angle ) + ydiff * std::cos(
angle );
2603 if (
const QgsPoint *point = qgsgeometry_cast< const QgsPoint * >( ddPoint.
constGet() ) )
2611 QgsMessageLog::logMessage( QObject::tr(
"Invalid data defined label position (%1, %2)" ).arg( xPos ).arg( yPos ), QObject::tr(
"Labeling" ) );
2612 hasDataDefinedPosition =
false;
2631 bool alwaysShow =
false;
2653 QString units = exprVal.toString().trimmed();
2654 if ( !units.isEmpty() )
2660 repeatUnits = decodedUnits;
2668 if ( repeatUnits != Qgis::RenderUnit::MapUnits )
2684 const double overrunSmoothDist = context.
convertToMapUnits( 1, Qgis::RenderUnit::Millimeters );
2686 bool labelAll =
labelPerPart && !hasDataDefinedPosition;
2687 if ( !hasDataDefinedPosition )
2697 std::unique_ptr< QgsTextLabelFeature > labelFeature = std::make_unique< QgsTextLabelFeature>( feature.
id(), std::move( geos_geom_clone ), QSizeF( labelWidth, labelHeight ) );
2698 labelFeature->setAnchorPosition( anchorPosition );
2699 labelFeature->setFeature( feature );
2700 labelFeature->setSymbol( symbol );
2701 labelFeature->setDocument( doc, documentMetrics );
2703 labelFeature->setRotatedSize( QSizeF( rotatedLabelX, rotatedLabelY ) );
2706 labelFeature->setHasFixedPosition( hasDataDefinedPosition );
2707 labelFeature->setFixedPosition(
QgsPointXY( xPos, yPos ) );
2709 labelFeature->setHasFixedAngle( dataDefinedRotation || ( !hasDataDefinedPosition && !
qgsDoubleNear(
angle, 0.0 ) ) );
2710 labelFeature->setFixedAngle(
angle );
2711 labelFeature->setQuadOffset( QPointF( quadOffsetX, quadOffsetY ) );
2712 labelFeature->setPositionOffset(
QgsPointXY( offsetX, offsetY ) );
2714 labelFeature->setAlwaysShow( alwaysShow );
2715 labelFeature->setRepeatDistance( repeatDist );
2716 labelFeature->setLabelText( labelText );
2717 labelFeature->setPermissibleZone( permissibleZone );
2718 labelFeature->setOverrunDistance( overrunDistanceEval );
2719 labelFeature->setOverrunSmoothDistance( overrunSmoothDist );
2723 labelFeature->setLabelAllParts( labelAll );
2725 labelFeature->setMinimumSize( minimumSize );
2726 if ( geom.
type() == Qgis::GeometryType::Point && !obstacleGeometry.
isNull() )
2729 labelFeature->setSymbolSize( QSizeF( obstacleGeometry.
boundingBox().
width(),
2733 if ( outerBounds.left() != 0 || outerBounds.top() != 0 || !
qgsDoubleNear( outerBounds.width(), labelWidth ) || !
qgsDoubleNear( outerBounds.height(), labelHeight ) )
2735 labelFeature->setOuterBounds( outerBounds );
2740 double topMargin = std::max( 0.25 * labelFontMetrics->ascent(), 0.0 );
2741 double bottomMargin = 1.0 + labelFontMetrics->descent();
2742 QgsMargins vm( 0.0, topMargin, 0.0, bottomMargin );
2744 labelFeature->setVisualMargin( vm );
2747 QgsDebugMsgLevel( QStringLiteral(
"PAL font stored definedFont: %1, Style: %2" ).arg( labelFont.toString(), labelFont.styleName() ), 4 );
2748 labelFeature->setDefinedFont( labelFont );
2750 labelFeature->setMaximumCharacterAngleInside( std::clamp( maxcharanglein, 20.0, 60.0 ) * M_PI / 180 );
2751 labelFeature->setMaximumCharacterAngleOutside( std::clamp( maxcharangleout, -95.0, -20.0 ) * M_PI / 180 );
2766 labelFeature->setTextMetrics(
QgsTextLabelFeature::calculateTextMetrics(
xform, context, labelFont, *labelFontMetrics, labelFont.letterSpacing(), labelFont.wordSpacing(), labelText,
format().allowHtmlFormatting() ? &doc :
nullptr,
format().allowHtmlFormatting() ? &documentMetrics :
nullptr ) );
2775 double distance =
dist;
2789 QString units = exprVal.toString().trimmed();
2790 QgsDebugMsgLevel( QStringLiteral(
"exprVal DistanceUnits:%1" ).arg( units ), 4 );
2791 if ( !units.isEmpty() )
2797 distUnit = decodedUnits;
2811 distance = ( distance < 0 ? -1 : 1 ) * std::max( std::fabs( distance ), 1.0 );
2821 if ( polygonPlacement & QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon )
2823 distance = std::max( distance, 2.0 );
2828 distance = std::max( distance, 2.0 );
2835 labelFeature->setDistLabel( d );
2840 labelFeature->setHasFixedQuadrant(
true );
2845 labelFeature->setPolygonPlacementFlags( polygonPlacement );
2854 labelFeature->setZIndex( z );
2864 double priorityD = exprVal.toDouble( &ok );
2867 priorityD = std::clamp( priorityD, 0.0, 10.0 );
2868 priorityD = 1 - priorityD / 10.0;
2869 labelFeature->setPriority( priorityD );
2882 labelFeature->setAllowDegradedPlacement( allowDegradedPlacement );
2891 const QString cleanedString = handlingString.trimmed();
2892 if ( cleanedString.compare( QLatin1String(
"prevent" ), Qt::CaseInsensitive ) == 0 )
2894 else if ( cleanedString.compare( QLatin1String(
"allowifneeded" ), Qt::CaseInsensitive ) == 0 )
2896 else if ( cleanedString.compare( QLatin1String(
"alwaysallow" ), Qt::CaseInsensitive ) == 0 )
2899 labelFeature->setOverlapHandling( overlapHandling );
2906 labelFeature->setObstacleSettings( os );
2909 if ( positionOrder.isEmpty() )
2910 positionOrder = *DEFAULT_PLACEMENT_ORDER();
2916 if ( !dataDefinedOrder.isEmpty() )
2921 labelFeature->setPredefinedPositionOrder( positionOrder );
2924 labelFeature->setDataDefinedValues( dataDefinedValues );
2926 return labelFeature;
2934 if ( !obstacleGeometry.
isNull() )
2936 geom = obstacleGeometry;
2951 if ( ls->numPoints() < 2 )
2957 std::unique_ptr<QgsGeometry> scopedClonedGeom;
2963 geom = simplifier.
simplify( geom );
2967 std::unique_ptr<QgsGeometry> scopedPreparedGeom;
2975 if ( !geos_geom_clone )
2979 std::unique_ptr< QgsLabelFeature > obstacleFeature = std::make_unique< QgsLabelFeature >( f.
id(), std::move( geos_geom_clone ), QSizeF( 0, 0 ) );
2980 obstacleFeature->setFeature( f );
2985 obstacleFeature->setObstacleSettings( os );
2988 return obstacleFeature;
2991bool QgsPalLayerSettings::dataDefinedValEval( DataDefinedValueType valType,
2995 if ( !mDataDefinedProperties.
isActive( p ) )
2999 exprVal = mDataDefinedProperties.
value( p, context );
3006 bool bol = exprVal.toBool();
3007 dataDefinedValues.insert( p, QVariant( bol ) );
3013 int size = exprVal.toInt( &ok );
3017 dataDefinedValues.insert( p, QVariant( size ) );
3025 int size = exprVal.toInt( &ok );
3027 if ( ok && size > 0 )
3029 dataDefinedValues.insert( p, QVariant( size ) );
3037 double size = exprVal.toDouble( &ok );
3041 dataDefinedValues.insert( p, QVariant( size ) );
3049 double size = exprVal.toDouble( &ok );
3051 if ( ok && size > 0.0 )
3053 dataDefinedValues.insert( p, QVariant( size ) );
3061 double rot = exprVal.toDouble( &ok );
3064 if ( rot < -180.0 && rot >= -360 )
3068 if ( rot > 180.0 && rot <= 360 )
3072 if ( rot >= -180 && rot <= 180 )
3074 dataDefinedValues.insert( p, QVariant( rot ) );
3083 int size = exprVal.toInt( &ok );
3084 if ( ok && size >= 0 && size <= 100 )
3086 dataDefinedValues.insert( p, QVariant( size ) );
3093 QString
str = exprVal.toString();
3095 dataDefinedValues.insert( p, QVariant(
str ) );
3100 QString unitstr = exprVal.toString().trimmed();
3102 if ( !unitstr.isEmpty() )
3111 QString colorstr = exprVal.toString().trimmed();
3114 if ( color.isValid() )
3116 dataDefinedValues.insert( p, QVariant( color ) );
3123 QString joinstr = exprVal.toString().trimmed();
3125 if ( !joinstr.isEmpty() )
3134 QString blendstr = exprVal.toString().trimmed();
3136 if ( !blendstr.isEmpty() )
3149 dataDefinedValues.insert( p, res );
3160 dataDefinedValues.insert( p, res );
3170void QgsPalLayerSettings::parseTextStyle( QFont &labelFont,
3183 QString ddFontFamily;
3190 QString family = exprVal.toString().trimmed();
3191 QgsDebugMsgLevel( QStringLiteral(
"exprVal Font family:%1" ).arg( family ), 4 );
3194 if ( labelFont.family() != family )
3200 ddFontFamily = family;
3207 QString ddFontStyle;
3213 QString fontstyle = exprVal.toString().trimmed();
3214 QgsDebugMsgLevel( QStringLiteral(
"exprVal Font style:%1" ).arg( fontstyle ), 4 );
3215 ddFontStyle = fontstyle;
3220 bool ddBold =
false;
3228 bool ddItalic =
false;
3238 QFont appFont = QApplication::font();
3239 bool newFontBuilt =
false;
3240 if ( ddBold || ddItalic )
3243 newFont = QFont( !ddFontFamily.isEmpty() ? ddFontFamily : labelFont.family() );
3244 newFontBuilt =
true;
3245 newFont.setBold( ddBold );
3246 newFont.setItalic( ddItalic );
3248 else if ( !ddFontStyle.isEmpty()
3249 && ddFontStyle.compare( QLatin1String(
"Ignore" ), Qt::CaseInsensitive ) != 0 )
3251 if ( !ddFontFamily.isEmpty() )
3255 mFontDB = std::make_unique< QFontDatabase >();
3257 QFont styledfont = mFontDB->font( ddFontFamily, ddFontStyle, appFont.pointSize() );
3258 if ( appFont != styledfont )
3260 newFont = styledfont;
3261 newFontBuilt =
true;
3268 else if ( !ddFontFamily.isEmpty() )
3270 if ( ddFontStyle.compare( QLatin1String(
"Ignore" ), Qt::CaseInsensitive ) != 0 )
3274 mFontDB = std::make_unique< QFontDatabase >();
3275 QFont styledfont = mFontDB->font( ddFontFamily, mFormat.
namedStyle(), appFont.pointSize() );
3276 if ( appFont != styledfont )
3278 newFont = styledfont;
3279 newFontBuilt =
true;
3284 newFont = QFont( ddFontFamily );
3285 newFontBuilt =
true;
3293 newFont.setPixelSize( labelFont.pixelSize() );
3294 newFont.setUnderline( labelFont.underline() );
3295 newFont.setStrikeOut( labelFont.strikeOut() );
3296 newFont.setWordSpacing( labelFont.wordSpacing() );
3297 newFont.setLetterSpacing( QFont::AbsoluteSpacing, labelFont.letterSpacing() );
3299 labelFont = newFont;
3303 double wordspace = labelFont.wordSpacing();
3312 double letterspace = labelFont.letterSpacing();
3325 labelFont.setStrikeOut( strikeout );
3340 labelFont.setUnderline( underline );
3366 drawBuffer = exprVal.toBool();
3379 double bufrSize = buffer.
size();
3382 bufrSize = exprVal.toDouble();
3386 double bufferOpacity = buffer.
opacity() * 100;
3389 bufferOpacity = exprVal.toDouble();
3392 drawBuffer = ( drawBuffer && bufrSize > 0.0 && bufferOpacity > 0 );
3422 bool maskEnabled = mask.
enabled();
3425 maskEnabled = exprVal.toBool();
3434 double bufrSize = mask.
size();
3437 bufrSize = exprVal.toDouble();
3441 double opacity = mask.
opacity() * 100;
3444 opacity = exprVal.toDouble();
3447 maskEnabled = ( maskEnabled && bufrSize > 0.0 && opacity > 0 );
3472 wrapchr = exprVal.toString();
3478 evalAutoWrapLength = exprVal.toInt();
3491 QString
str = exprVal.toString().trimmed();
3494 if ( !
str.isEmpty() )
3499 if (
str.compare( QLatin1String(
"Center" ), Qt::CaseInsensitive ) == 0 )
3501 aligntype = Qgis::LabelMultiLineAlignment::Center;
3503 else if (
str.compare( QLatin1String(
"Right" ), Qt::CaseInsensitive ) == 0 )
3505 aligntype = Qgis::LabelMultiLineAlignment::Right;
3507 else if (
str.compare( QLatin1String(
"Follow" ), Qt::CaseInsensitive ) == 0 )
3509 aligntype = Qgis::LabelMultiLineAlignment::FollowPlacement;
3511 else if (
str.compare( QLatin1String(
"Justify" ), Qt::CaseInsensitive ) == 0 )
3513 aligntype = Qgis::LabelMultiLineAlignment::Justify;
3528 QString
str = exprVal.toString().trimmed();
3529 if ( !
str.isEmpty() )
3538 drawDirSymb = exprVal.toBool();
3553 QString
str = exprVal.toString().trimmed();
3556 if ( !
str.isEmpty() )
3561 if (
str.compare( QLatin1String(
"Above" ), Qt::CaseInsensitive ) == 0 )
3565 else if (
str.compare( QLatin1String(
"Below" ), Qt::CaseInsensitive ) == 0 )
3587 bool drawShape = background.
enabled();
3590 drawShape = exprVal.toBool();
3599 double shapeOpacity = background.
opacity() * 100;
3602 shapeOpacity = 100.0 * exprVal.toDouble();
3605 drawShape = ( drawShape && shapeOpacity > 0 );
3621 QString skind = exprVal.toString().trimmed();
3622 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeKind:%1" ).arg( skind ), 4 );
3624 if ( !skind.isEmpty() )
3633 QString svgPath = background.
svgFile();
3640 QString svgfile = exprVal.toString().trimmed();
3641 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeSVGFile:%1" ).arg( svgfile ), 4 );
3656 QString stype = exprVal.toString().trimmed();
3657 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeSizeType:%1" ).arg( stype ), 4 );
3659 if ( !stype.isEmpty() )
3668 double ddShpSizeX = background.
size().width();
3671 ddShpSizeX = exprVal.toDouble();
3675 double ddShpSizeY = background.
size().height();
3678 ddShpSizeY = exprVal.toDouble();
3684 && ( svgPath.isEmpty()
3685 || ( !svgPath.isEmpty()
3687 && ddShpSizeX == 0.0 ) ) )
3695 && ddShpSizeX == 0.0 ) ) )
3702 && ( ddShpSizeX == 0.0 || ddShpSizeY == 0.0 ) )
3727 QString rotstr = exprVal.toString().trimmed();
3728 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeRotationType:%1" ).arg( rotstr ), 4 );
3730 if ( !rotstr.isEmpty() )
3781 bool drawShadow = shadow.
enabled();
3784 drawShadow = exprVal.toBool();
3793 double shadowOpacity = shadow.
opacity() * 100;
3796 shadowOpacity = exprVal.toDouble();
3803 shadowOffDist = exprVal.toDouble();
3810 shadowRad = exprVal.toDouble();
3813 drawShadow = ( drawShadow && shadowOpacity > 0 && !( shadowOffDist == 0.0 && shadowRad == 0.0 ) );
3830 QString
str = exprVal.toString().trimmed();
3833 if ( !
str.isEmpty() )
3868 switch ( layer->
type() )
3870 case Qgis::LayerType::Vector:
3872 const QgsVectorLayer *vl = qobject_cast< const QgsVectorLayer * >( layer );
3876 case Qgis::LayerType::VectorTile:
3883 return !labeling->styles().empty();
3888 case Qgis::LayerType::Raster:
3889 case Qgis::LayerType::Plugin:
3890 case Qgis::LayerType::Mesh:
3891 case Qgis::LayerType::PointCloud:
3892 case Qgis::LayerType::Annotation:
3893 case Qgis::LayerType::Group:
3907 if ( geometry.
type() == Qgis::GeometryType::Line && geometry.
isMultipart() && mergeLines )
3926 if ( geometry.
type() == Qgis::GeometryType::Polygon && !geometry.
isGeosValid() )
3932QStringList
QgsPalLabeling::splitToLines(
const QString &text,
const QString &wrapCharacter,
const int autoWrapLength,
const bool useMaxLineLengthWhenAutoWrapping )
3934 QStringList multiLineSplit;
3935 if ( !wrapCharacter.isEmpty() && wrapCharacter != QLatin1String(
"\n" ) )
3938 const QStringList lines = text.split( wrapCharacter );
3939 for (
const QString &line : lines )
3941 multiLineSplit.append( line.split(
'\n' ) );
3946 multiLineSplit = text.split(
'\n' );
3950 if ( autoWrapLength != 0 )
3952 QStringList autoWrappedLines;
3953 autoWrappedLines.reserve( multiLineSplit.count() );
3954 for (
const QString &line : std::as_const( multiLineSplit ) )
3956 autoWrappedLines.append(
QgsStringUtils::wordWrap( line, autoWrapLength, useMaxLineLengthWhenAutoWrapping ).split(
'\n' ) );
3958 multiLineSplit = autoWrappedLines;
3960 return multiLineSplit;
3965 QStringList graphemes;
3966 QTextBoundaryFinder boundaryFinder( QTextBoundaryFinder::Grapheme, text );
3967 int currentBoundary = -1;
3968 int previousBoundary = 0;
3969 while ( ( currentBoundary = boundaryFinder.toNextBoundary() ) > 0 )
3971 graphemes << text.mid( previousBoundary, currentBoundary - previousBoundary );
3972 previousBoundary = currentBoundary;
3987 if ( geom.
type() == Qgis::GeometryType::Line && geom.
isMultipart() && mergeLines )
4002 QgsDebugMsgLevel( QStringLiteral(
"Ignoring feature due to transformation exception" ), 4 );
4008 return std::isfinite( point.
x() ) && std::isfinite( point.
y() );
4012 cp->removeInvalidRings();
4014 else if (
QgsMultiSurface *ms = qgsgeometry_cast< QgsMultiSurface * >( geom.
get() ) )
4016 for (
int i = 0; i < ms->numGeometries(); ++i )
4018 if (
QgsCurvePolygon *cp = qgsgeometry_cast< QgsCurvePolygon * >( ms->geometryN( i ) ) )
4019 cp->removeInvalidRings();
4031 QgsDebugMsg( QStringLiteral(
"Error rotating geometry" ).arg( geom.
asWkt() ) );
4036 const bool mustClip = ( !clipGeometry.
isNull() &&
4040 bool mustClipExact =
false;
4056 if ( geom.
type() == Qgis::GeometryType::Polygon )
4064 QVector< QgsGeometry> parts;
4065 parts.reserve( qgsgeometry_cast< const QgsGeometryCollection * >( geom.
constGet() )->numGeometries() );
4074 parts.append( partGeom );
4082 if ( bufferGeom.
isNull() )
4084 QgsDebugMsg( QStringLiteral(
"Could not repair geometry: %1" ).arg( bufferGeom.
lastError() ) );
4091 if ( mustClipExact )
4118 if ( featureType == Qgis::GeometryType::Point )
4124 if ( featureType == Qgis::GeometryType::Line )
4126 double length = geom.
length();
4127 if ( length >= 0.0 )
4129 return ( length >= ( minSize * mapUnitsPerMM ) );
4132 else if ( featureType == Qgis::GeometryType::Polygon )
4134 double area = geom.
area();
4137 return ( std::sqrt( area ) >= ( minSize * mapUnitsPerMM ) );
4145 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4148 bool changed =
false;
4154 format.
setColor( ddColor.value<QColor>() );
4179 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4241 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4244 bool changed =
false;
4292 buffer.
setColor( ddColor.value<QColor>() );
4319 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4321 if ( ddValues.isEmpty() )
4325 bool changed =
false;
4385 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4388 bool changed =
false;
4428 QSizeF size = background.
size();
4435 QSizeF size = background.
size();
4536 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4539 bool changed =
false;
4598 shadow.
setColor( ddColor.value<QColor>() );
4638 double cx = lp->
getX() + w / 2.0;
4639 double cy = lp->
getY() + h / 2.0;
4642 double sw = w * scale;
4643 double sh = h * scale;
4644 QRectF rect( -sw / 2, -sh / 2, sw, sh );
4646 painter->translate( xform->
transform( QPointF( cx, cy ) ).toQPointF() );
4650 if ( lp->
getFeaturePart()->getLayer()->getArrangement() != P_POINT &&
4651 lp->
getFeaturePart()->getLayer()->getArrangement() != P_POINT_OVER &&
4654 painter->rotate( rotation );
4657 painter->translate( rect.bottomLeft() );
4658 painter->rotate( -lp->
getAlpha() * 180 / M_PI );
4659 painter->translate( -rect.bottomLeft() );
4662 QRectF rect( 0, 0, outPt2.
x() - outPt.
x(), outPt2.
y() - outPt.
y() );
4663 painter->translate( QPointF( outPt.
x(), outPt.
y() ) );
4664 painter->rotate( -lp->
getAlpha() * 180 / M_PI );
4669 painter->setPen( QColor( 255, 0, 0, 64 ) );
4673 painter->setPen( QColor( 0, 0, 0, 64 ) );
4675 painter->drawRect( rect );
4679 rect.moveTo( outPt.
x(), outPt.
y() );
@ Success
Operation succeeded.
AngleUnit
Units of angles.
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.
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....
@ Warning
Warning message.
Capitalization
String capitalization options.
@ AllSmallCaps
Force all characters to small caps (since QGIS 3.24)
@ 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 (since QGIS 3.24)
@ ForceFirstLetterToCapital
Convert just the first letter of each word to uppercase, leave the rest untouched.
@ AllUppercase
Convert all characters to uppercase.
LabelQuadrantPosition
Label quadrant positions.
TextOrientation
Text orientations.
UnplacedLabelVisibility
Unplaced label visibility.
@ FollowEngineSetting
Respect the label engine setting.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
LabelMultiLineAlignment
Text alignment for multi-line labels.
RenderUnit
Rendering size units.
@ 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.
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.
This class represents a coordinate reference system (CRS).
QString userFriendlyIdentifier(IdentifierType type=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.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Container of fields for a vector layer.
int 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 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.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
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.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
bool isAxisParallelRectangle(double maximumDeviation, bool simpleRectanglesOnly=false) const
Returns true if the geometry is a polygon that is almost an axis-parallel rectangle.
QgsAbstractGeometry * get()
Returns a modifiable (non-const) reference to the underlying abstract geometry primitive.
static QgsGeometry fromRect(const QgsRectangle &rect) SIP_HOLDGIL
Creates a new geometry from a QgsRectangle.
bool isMultipart() const SIP_HOLDGIL
Returns true if WKB of the geometry is of WKBMulti* type.
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) SIP_HOLDGIL
Creates a new geometry from a QgsPointXY object.
double area() const
Returns the planar, 2-dimensional area of the geometry.
QgsGeometry centroid() const
Returns the center of mass of a geometry.
QString lastError() const SIP_HOLDGIL
Returns an error string referring to the last error encountered either when this geometry was created...
QgsGeometry makeValid(Qgis::MakeValidMethod method=Qgis::MakeValidMethod::Linework, bool keepCollapsed=false) const SIP_THROW(QgsNotSupportedException)
Attempts to make an invalid geometry valid without losing vertices.
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.
QString asWkt(int precision=17) const
Exports the geometry to WKT.
static geos::unique_ptr asGeos(const QgsGeometry &geometry, double precision=0)
Returns a geos geometry - caller takes ownership of the object (should be deleted with GEOSGeom_destr...
Represents a label candidate.
Contains settings related to how the label engine places and formats labels for line features (or pol...
AnchorType
Line anchor types.
void setPlacementFlags(QgsLabeling::LinePlacementFlags flags)
Returns the line placement flags, which dictate how line labels can be placed above or below the line...
QgsLabeling::LinePlacementFlags placementFlags() const
Returns the line placement flags, which dictate how line labels can be placed above or below the line...
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 thinning settings to respect any data defined properties set within the specified propert...
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.
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,...
ObstacleType
Valid obstacle types, which affect how features within the layer will act as obstacles for 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.
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.
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.
SimplifyAlgorithm
Types of simplification algorithms that can be used.
@ 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.
QgsPointXY transform(const QgsPointXY &p) const
Transforms a point p from map (world) coordinates to device 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.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
Multi surface geometry collection.
static void drawLabelCandidateRect(pal::LabelPosition *lp, QPainter *painter, const QgsMapToPixel *xform, QList< QgsLabelCandidate > *candidates=nullptr)
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.
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, QgsTextDocument *document=nullptr, QgsTextDocumentMetrics *documentMetrics=nullptr, QRectF *outerBounds=nullptr)
Calculates the space required to render the provided text in map units.
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.
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.
Qgis::LabelQuadrantPosition quadOffset
Sets the quadrant in which to offset labels from feature.
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.
QVector< Qgis::LabelPredefinedPointPosition > predefinedPositionOrder
Ordered list of predefined label positions for points.
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.
Property
Data definable properties.
@ MaskEnabled
Whether the mask is enabled.
@ LabelRotation
Label rotation.
@ PositionY
Y-coordinate data defined label position.
@ OverlapHandling
Overlap handling technique (since QGIS 3.26)
@ OverrunDistance
Distance which labels can extend past either end of linear features.
@ Strikeout
Use strikeout.
@ FontStyle
Font style name.
@ PositionX
X-coordinate data defined label position.
@ CalloutDraw
Show callout.
@ Underline
Use underline.
@ FontLetterSpacing
Letter spacing.
@ MaskJoinStyle
Mask join style.
@ PositionPoint
Point-coordinate data defined label position.
@ MaxScale
Max scale (deprecated, for old project compatibility only)
@ Hali
Horizontal alignment for data defined label position (Left, Center, Right)
@ FontStretchFactor
Font stretch factor, since QGIS 3.24.
@ FontTransp
Text transparency (deprecated)
@ MaskBufferUnit
Mask buffer size unit.
@ LabelAllParts
Whether all parts of multi-part features should be labeled.
@ AllowDegradedPlacement
Allow degraded label placements (since QGIS 3.26)
@ ShadowOpacity
Shadow opacity.
@ BufferOpacity
Buffer opacity.
@ LineAnchorPercent
Portion along line at which labels should be anchored (since QGIS 3.16)
@ ShapeOpacity
Shape opacity.
@ FontSizeUnit
Font size units.
@ Rotation
Label rotation (deprecated, for old project compatibility only)
@ Italic
Use italic style.
@ ShapeTransparency
Shape transparency (deprecated)
@ PredefinedPositionOrder
@ ShadowTransparency
Shadow transparency (deprecated)
@ MinScale
Min scale (deprecated, for old project compatibility only)
@ FontWordSpacing
Word spacing.
@ MaskBufferSize
Mask buffer size.
@ LineAnchorType
Line anchor type (since QGIS 3.26)
@ LineAnchorClipping
Clipping mode for line anchor calculation (since QGIS 3.20)
@ MinimumScale
Minimum map scale (ie most "zoomed out")
@ FontBlendMode
Text blend mode.
@ MaximumScale
Maximum map scale (ie most "zoomed in")
@ MaskOpacity
Mask opacity.
@ BufferTransp
Buffer transparency (deprecated)
@ PolygonLabelOutside
Whether labels outside a polygon feature are permitted, or should be forced (since QGIS 3....
@ FontCase
Label text case.
@ LineAnchorTextPoint
Line anchor text point (since QGIS 3.26)
@ LinePlacementOptions
Line placement flags.
@ Vali
Vertical alignment for data defined label position (Bottom, Base, Half, Cap, Top)
@ FontOpacity
Text opacity.
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.
static QPixmap labelSettingsPreviewPixmap(const QgsPalLayerSettings &settings, QSize size, const QString &previewText=QString(), int padding=0)
Returns a pixmap preview for label settings.
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...
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.
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.
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 SIP_HOLDGIL
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 SIP_HOLDGIL
Returns true if the geometry is empty.
QgsProperty property(int key) const override
Returns a matching property from the collection, if one exists.
QVariant value(int key, const QgsExpressionContext &context, const QVariant &defaultValue=QVariant()) const override
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.
QSet< QString > referencedFields(const QgsExpressionContext &context=QgsExpressionContext(), bool ignoreContext=false) const override
Returns the set of any fields referenced by the active properties from the collection.
void clear() override
Removes all properties from the collection.
bool isActive(int key) const override
Returns true if the collection contains an active property with the specified key.
bool hasActiveProperties() const override
Returns true if the collection has any active properties, or false if all properties within the colle...
bool prepare(const QgsExpressionContext &context=QgsExpressionContext()) const override
Prepares the collection against a specified expression context.
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.
The class is used as a container of context for various read/write operations on other objects.
A rectangle specified with double values.
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
void grow(double delta)
Grows the rectangle in place by the specified amount.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
bool contains(const QgsRectangle &rect) const SIP_HOLDGIL
Returns true when rectangle contains other rectangle.
QgsPointXY center() const SIP_HOLDGIL
Returns the center point of the rectangle.
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.
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 QgsVectorSimplifyMethod & vectorSimplifyMethod() const
Returns the simplification settings to use when rendering vector layers.
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...
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()
Returns default application-wide style.
@ Labeling
Text format used in labeling.
static Qt::PenJoinStyle decodePenJoinStyle(const QString &str)
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
static QColor decodeColor(const QString &str)
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 encodeColor(const QColor &color)
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.
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...
static QgsTextDocumentMetrics calculateMetrics(const QgsTextDocument &document, const QgsTextFormat &format, const QgsRenderContext &context, double scaleFactor=1.0)
Returns precalculated text metrics for a text document, when rendered using the given base format and...
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.
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.
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the size.
void setOrientation(Qgis::TextOrientation orientation)
Sets the orientation for the 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.
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.
double opacity() const
Returns the text's opacity.
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 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 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)
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.
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,...
SimplifyHints simplifyHints() const
Gets the simplification hints of the vector layer managed.
SimplifyAlgorithm simplifyAlgorithm() const
Gets the local simplification algorithm of the vector layer managed.
@ NoSimplification
No simplification can be applied.
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.
LabelPosition is a candidate feature label position.
double getAlpha() const
Returns the angle to rotate text (in rad).
double cost() const
Returns the candidate label position's geographical cost.
bool conflictsWithObstacle() const
Returns whether the position is marked as conflicting with an obstacle feature.
FeaturePart * getFeaturePart() const
Returns the feature corresponding to this labelposition.
double getX(int i=0) const
Returns the down-left x coordinate.
double getY(int i=0) const
Returns the down-left y coordinate.
LabelPosition * nextPart() const
Returns the next part of this label position (i.e.
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
std::unique_ptr< GEOSGeometry, GeosDeleter > unique_ptr
Scoped GEOS pointer.
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)
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