36 #include <QApplication>
39 #include <QFontMetrics>
42 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
43 #include <QDesktopWidget>
48 #include <QTextBoundaryFinder>
115 if ( !sPropertyDefinitions()->isEmpty() )
118 const QString origin = QStringLiteral(
"labeling" );
130 "e.g. Helvetica or Helvetica [Cronyx]" ), origin )
134 "e.g. Bold Condensed or Light Italic" ), origin )
175 "<b>Ellipse</b>|<b>Circle</b>|<b>SVG</b>]" ), origin )
199 "<b>Buffer</b>|<b>Background</b>]" ), origin )
215 "<b>3</b>=Left|<b>4</b>=Over|<b>5</b>=Right|<br>"
216 "<b>6</b>=Below Left|<b>7</b>=Below|<b>8</b>=Below Right]" ), origin )
234 + QStringLiteral(
"[<b>TL</b>=Top left|<b>TSL</b>=Top, slightly left|<b>T</b>=Top middle|<br>"
235 "<b>TSR</b>=Top, slightly right|<b>TR</b>=Top right|<br>"
236 "<b>L</b>=Left|<b>R</b>=Right|<br>"
237 "<b>BL</b>=Bottom left|<b>BSL</b>=Bottom, slightly left|<b>B</b>=Bottom middle|<br>"
238 "<b>BSR</b>=Bottom, slightly right|<b>BR</b>=Bottom right]" ), origin )
242 + QStringLiteral(
"[<b>OL</b>=On line|<b>AL</b>=Above line|<b>BL</b>=Below line|<br>"
243 "<b>LO</b>=Respect line orientation]" ), origin )
252 "<b>Half</b>|<b>Cap</b>|<b>Top</b>]" ), origin )
275 : predefinedPositionOrder( *DEFAULT_PLACEMENT_ORDER() )
278 initPropertyDefinitions();
287 , mDataDefinedProperties( s.mDataDefinedProperties )
322 mPolygonPlacementFlags = s.mPolygonPlacementFlags;
338 mRotationUnit = s.mRotationUnit;
360 mDataDefinedProperties = s.mDataDefinedProperties;
362 mCallout.reset( s.mCallout ? s.mCallout->clone() :
nullptr );
364 mLineSettings = s.mLineSettings;
365 mObstacleSettings = s.mObstacleSettings;
366 mThinningSettings = s.mThinningSettings;
373 mLegendString = s.mLegendString;
375 mUnplacedVisibility = s.mUnplacedVisibility;
425 for (
const QString &name : referencedColumns )
427 attributeNames.insert( name );
486 for (
const QString &name : referencedColumns )
488 attributeNames.insert( name );
495 const auto referencedColumns = mCallout->referencedFields( context );
496 for (
const QString &name : referencedColumns )
498 attributeNames.insert( name );
507 QSet<QString> referenced;
535 referenced.unite( mCallout->referencedFields( context ) );
543 if ( mRenderStarted )
545 qWarning(
"Start render called for when a previous render was already underway!!" );
558 mCallout->startRender( context );
561 mRenderStarted =
true;
566 if ( !mRenderStarted )
568 qWarning(
"Stop render called for QgsPalLayerSettings without a startRender call!" );
574 mCallout->stopRender( context );
577 mRenderStarted =
false;
587 if ( mRenderStarted )
589 qWarning(
"stopRender was not called on QgsPalLayerSettings object!" );
600 initPropertyDefinitions();
601 return *sPropertyDefinitions();
615 return mRotationUnit;
620 mRotationUnit = angleUnit;
626 QString newValue = value;
627 if ( !value.isEmpty() && !value.contains( QLatin1String(
"~~" ) ) )
630 values << QStringLiteral(
"1" );
631 values << QStringLiteral(
"0" );
634 newValue = values.join( QLatin1String(
"~~" ) );
642 QString newPropertyName =
"labeling/dataDefined/" + sPropertyDefinitions()->value( p ).name();
643 QVariant newPropertyField = layer->
customProperty( newPropertyName, QVariant() );
645 if ( !newPropertyField.isValid() )
648 QString ddString = newPropertyField.toString();
650 if ( !ddString.isEmpty() && ddString != QLatin1String(
"0~~0~~~~" ) )
654 QStringList ddv = newStyleString.split( QStringLiteral(
"~~" ) );
656 bool active = ddv.at( 0 ).toInt();
657 if ( ddv.at( 1 ).toInt() )
673 void QgsPalLayerSettings::readOldDataDefinedPropertyMap(
QgsVectorLayer *layer, QDomElement *parentElem )
675 if ( !layer && !parentElem )
680 QgsPropertiesDefinition::const_iterator i = sPropertyDefinitions()->constBegin();
681 for ( ; i != sPropertyDefinitions()->constEnd(); ++i )
686 readOldDataDefinedProperty( layer,
static_cast< Property >( i.key() ) );
688 else if ( parentElem )
691 QDomElement e = parentElem->firstChildElement( i.value().name() );
694 bool active = e.attribute( QStringLiteral(
"active" ) ).compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0;
695 bool isExpression = e.attribute( QStringLiteral(
"useExpr" ) ).compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0;
709 void QgsPalLayerSettings::readFromLayerCustomProperties(
QgsVectorLayer *layer )
711 if ( layer->
customProperty( QStringLiteral(
"labeling" ) ).toString() != QLatin1String(
"pal" ) )
736 QDomDocument doc( QStringLiteral(
"substitutions" ) );
737 doc.setContent( layer->
customProperty( QStringLiteral(
"labeling/substitutions" ) ).toString() );
738 QDomElement replacementElem = doc.firstChildElement( QStringLiteral(
"substitutions" ) );
759 mLineSettings.
setPlacementFlags(
static_cast< QgsLabeling::LinePlacementFlags
>( layer->
customProperty( QStringLiteral(
"labeling/placementFlags" ) ).toUInt() ) );
768 if ( layer->
customProperty( QStringLiteral(
"labeling/distMapUnitScale" ) ).toString().isEmpty() )
771 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/distMapUnitMinScale" ), 0.0 ).toDouble();
773 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/distMapUnitMaxScale" ), 0.0 ).toDouble();
784 if ( layer->
customProperty( QStringLiteral(
"labeling/labelOffsetInMapUnits" ), QVariant(
true ) ).toBool() )
789 if ( layer->
customProperty( QStringLiteral(
"labeling/labelOffsetMapUnitScale" ) ).toString().isEmpty() )
792 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/labelOffsetMapUnitMinScale" ), 0.0 ).toDouble();
794 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/labelOffsetMapUnitMaxScale" ), 0.0 ).toDouble();
802 QVariant tempAngle = layer->
customProperty( QStringLiteral(
"labeling/angleOffset" ), QVariant() );
803 if ( tempAngle.isValid() )
805 double oldAngle = layer->
customProperty( QStringLiteral(
"labeling/angleOffset" ), QVariant( 0.0 ) ).toDouble();
819 switch ( layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceUnit" ), QVariant( 1 ) ).toUInt() )
834 if ( layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceMapUnitScale" ) ).toString().isEmpty() )
837 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceMapUnitMinScale" ), 0.0 ).toDouble();
839 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceMapUnitMaxScale" ), 0.0 ).toDouble();
848 double scalemn = layer->
customProperty( QStringLiteral(
"labeling/scaleMin" ), QVariant( 0 ) ).toDouble();
849 double scalemx = layer->
customProperty( QStringLiteral(
"labeling/scaleMax" ), QVariant( 0 ) ).toDouble();
852 QVariant scalevis = layer->
customProperty( QStringLiteral(
"labeling/scaleVisibility" ), QVariant() );
853 if ( scalevis.isValid() )
859 else if ( scalemn > 0 || scalemx > 0 )
884 mObstacleSettings.
setFactor( layer->
customProperty( QStringLiteral(
"labeling/obstacleFactor" ), QVariant( 1.0 ) ).toDouble() );
886 zIndex = layer->
customProperty( QStringLiteral(
"labeling/zIndex" ), QVariant( 0.0 ) ).toDouble();
888 mDataDefinedProperties.
clear();
889 if ( layer->
customProperty( QStringLiteral(
"labeling/ddProperties" ) ).isValid() )
891 QDomDocument doc( QStringLiteral(
"dd" ) );
892 doc.setContent( layer->
customProperty( QStringLiteral(
"labeling/ddProperties" ) ).toString() );
893 QDomElement elem = doc.firstChildElement( QStringLiteral(
"properties" ) );
894 mDataDefinedProperties.
readXml( elem, *sPropertyDefinitions() );
899 readOldDataDefinedPropertyMap( layer,
nullptr );
943 QDomElement textStyleElem = elem.firstChildElement( QStringLiteral(
"text-style" ) );
944 fieldName = textStyleElem.attribute( QStringLiteral(
"fieldName" ) );
945 isExpression = textStyleElem.attribute( QStringLiteral(
"isExpression" ) ).toInt();
947 mFormat.
readXml( elem, context );
949 previewBkgrdColor = QColor( textStyleElem.attribute( QStringLiteral(
"previewBkgrdColor" ), QStringLiteral(
"#ffffff" ) ) );
952 useSubstitutions = textStyleElem.attribute( QStringLiteral(
"useSubstitutions" ) ).toInt();
953 mLegendString = textStyleElem.attribute( QStringLiteral(
"legendString" ), QObject::tr(
"Aa" ) );
956 QDomElement textFormatElem = elem.firstChildElement( QStringLiteral(
"text-format" ) );
957 wrapChar = textFormatElem.attribute( QStringLiteral(
"wrapChar" ) );
958 autoWrapLength = textFormatElem.attribute( QStringLiteral(
"autoWrapLength" ), QStringLiteral(
"0" ) ).toInt();
959 useMaxLineLengthForAutoWrap = textFormatElem.attribute( QStringLiteral(
"useMaxLineLengthForAutoWrap" ), QStringLiteral(
"1" ) ).toInt();
961 mLineSettings.
setAddDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"addDirectionSymbol" ) ).toInt() );
962 mLineSettings.
setLeftDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"leftDirectionSymbol" ), QStringLiteral(
"<" ) ) );
963 mLineSettings.
setRightDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"rightDirectionSymbol" ), QStringLiteral(
">" ) ) );
964 mLineSettings.
setReverseDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"reverseDirectionSymbol" ) ).toInt() );
966 formatNumbers = textFormatElem.attribute( QStringLiteral(
"formatNumbers" ) ).toInt();
967 decimals = textFormatElem.attribute( QStringLiteral(
"decimals" ) ).toInt();
968 plusSign = textFormatElem.attribute( QStringLiteral(
"plussign" ) ).toInt();
971 QDomElement placementElem = elem.firstChildElement( QStringLiteral(
"placement" ) );
972 placement =
static_cast< Placement >( placementElem.attribute( QStringLiteral(
"placement" ) ).toInt() );
973 mLineSettings.
setPlacementFlags(
static_cast< QgsLabeling::LinePlacementFlags
>( placementElem.attribute( QStringLiteral(
"placementFlags" ) ).toUInt() ) );
974 mPolygonPlacementFlags =
static_cast< QgsLabeling::PolygonPlacementFlags
>( placementElem.attribute( QStringLiteral(
"polygonPlacementFlags" ), QString::number(
static_cast< int >( QgsLabeling::PolygonPlacementFlag::AllowPlacementInsideOfPolygon ) ) ).toInt() );
976 centroidWhole = placementElem.attribute( QStringLiteral(
"centroidWhole" ), QStringLiteral(
"0" ) ).toInt();
977 centroidInside = placementElem.attribute( QStringLiteral(
"centroidInside" ), QStringLiteral(
"0" ) ).toInt();
981 fitInPolygonOnly = placementElem.attribute( QStringLiteral(
"fitInPolygonOnly" ), QStringLiteral(
"0" ) ).toInt();
982 dist = placementElem.attribute( QStringLiteral(
"dist" ) ).toDouble();
983 if ( !placementElem.hasAttribute( QStringLiteral(
"distUnits" ) ) )
985 if ( placementElem.attribute( QStringLiteral(
"distInMapUnits" ) ).toInt() )
994 if ( !placementElem.hasAttribute( QStringLiteral(
"distMapUnitScale" ) ) )
997 double oldMin = placementElem.attribute( QStringLiteral(
"distMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
999 double oldMax = placementElem.attribute( QStringLiteral(
"distMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
1008 xOffset = placementElem.attribute( QStringLiteral(
"xOffset" ), QStringLiteral(
"0" ) ).toDouble();
1009 yOffset = placementElem.attribute( QStringLiteral(
"yOffset" ), QStringLiteral(
"0" ) ).toDouble();
1010 if ( !placementElem.hasAttribute( QStringLiteral(
"offsetUnits" ) ) )
1018 if ( !placementElem.hasAttribute( QStringLiteral(
"labelOffsetMapUnitScale" ) ) )
1021 double oldMin = placementElem.attribute( QStringLiteral(
"labelOffsetMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
1023 double oldMax = placementElem.attribute( QStringLiteral(
"labelOffsetMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
1031 if ( placementElem.hasAttribute( QStringLiteral(
"angleOffset" ) ) )
1033 double oldAngle = placementElem.attribute( QStringLiteral(
"angleOffset" ), QStringLiteral(
"0" ) ).toDouble();
1038 angleOffset = placementElem.attribute( QStringLiteral(
"rotationAngle" ), QStringLiteral(
"0" ) ).toDouble();
1041 preserveRotation = placementElem.attribute( QStringLiteral(
"preserveRotation" ), QStringLiteral(
"1" ) ).toInt();
1043 maxCurvedCharAngleIn = placementElem.attribute( QStringLiteral(
"maxCurvedCharAngleIn" ), QStringLiteral(
"25" ) ).toDouble();
1044 maxCurvedCharAngleOut = placementElem.attribute( QStringLiteral(
"maxCurvedCharAngleOut" ), QStringLiteral(
"-25" ) ).toDouble();
1045 priority = placementElem.attribute( QStringLiteral(
"priority" ) ).toInt();
1046 repeatDistance = placementElem.attribute( QStringLiteral(
"repeatDistance" ), QStringLiteral(
"0" ) ).toDouble();
1047 if ( !placementElem.hasAttribute( QStringLiteral(
"repeatDistanceUnits" ) ) )
1050 switch ( placementElem.attribute( QStringLiteral(
"repeatDistanceUnit" ), QString::number( 1 ) ).toUInt() )
1070 if ( !placementElem.hasAttribute( QStringLiteral(
"repeatDistanceMapUnitScale" ) ) )
1073 double oldMin = placementElem.attribute( QStringLiteral(
"repeatDistanceMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
1075 double oldMax = placementElem.attribute( QStringLiteral(
"repeatDistanceMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
1083 mLineSettings.
setOverrunDistance( placementElem.attribute( QStringLiteral(
"overrunDistance" ), QStringLiteral(
"0" ) ).toDouble() );
1086 mLineSettings.
setLineAnchorPercent( placementElem.attribute( QStringLiteral(
"lineAnchorPercent" ), QStringLiteral(
"0.5" ) ).toDouble() );
1090 geometryGenerator = placementElem.attribute( QStringLiteral(
"geometryGenerator" ) );
1097 QDomElement renderingElem = elem.firstChildElement( QStringLiteral(
"rendering" ) );
1099 drawLabels = renderingElem.attribute( QStringLiteral(
"drawLabels" ), QStringLiteral(
"1" ) ).toInt();
1101 maximumScale = renderingElem.attribute( QStringLiteral(
"scaleMin" ), QStringLiteral(
"0" ) ).toDouble();
1102 minimumScale = renderingElem.attribute( QStringLiteral(
"scaleMax" ), QStringLiteral(
"0" ) ).toDouble();
1103 scaleVisibility = renderingElem.attribute( QStringLiteral(
"scaleVisibility" ) ).toInt();
1105 fontLimitPixelSize = renderingElem.attribute( QStringLiteral(
"fontLimitPixelSize" ), QStringLiteral(
"0" ) ).toInt();
1106 fontMinPixelSize = renderingElem.attribute( QStringLiteral(
"fontMinPixelSize" ), QStringLiteral(
"0" ) ).toInt();
1107 fontMaxPixelSize = renderingElem.attribute( QStringLiteral(
"fontMaxPixelSize" ), QStringLiteral(
"10000" ) ).toInt();
1108 displayAll = renderingElem.attribute( QStringLiteral(
"displayAll" ), QStringLiteral(
"0" ) ).toInt();
1111 labelPerPart = renderingElem.attribute( QStringLiteral(
"labelPerPart" ) ).toInt();
1112 mLineSettings.
setMergeLines( renderingElem.attribute( QStringLiteral(
"mergeLines" ) ).toInt() );
1113 mThinningSettings.
setMinimumFeatureSize( renderingElem.attribute( QStringLiteral(
"minFeatureSize" ) ).toDouble() );
1114 mThinningSettings.
setLimitNumberLabelsEnabled( renderingElem.attribute( QStringLiteral(
"limitNumLabels" ), QStringLiteral(
"0" ) ).toInt() );
1115 mThinningSettings.
setMaximumNumberLabels( renderingElem.attribute( QStringLiteral(
"maxNumLabels" ), QStringLiteral(
"2000" ) ).toInt() );
1116 mObstacleSettings.
setIsObstacle( renderingElem.attribute( QStringLiteral(
"obstacle" ), QStringLiteral(
"1" ) ).toInt() );
1117 mObstacleSettings.
setFactor( renderingElem.attribute( QStringLiteral(
"obstacleFactor" ), QStringLiteral(
"1" ) ).toDouble() );
1119 zIndex = renderingElem.attribute( QStringLiteral(
"zIndex" ), QStringLiteral(
"0.0" ) ).toDouble();
1122 QDomElement ddElem = elem.firstChildElement( QStringLiteral(
"dd_properties" ) );
1123 if ( !ddElem.isNull() )
1125 mDataDefinedProperties.
readXml( ddElem, *sPropertyDefinitions() );
1130 mDataDefinedProperties.
clear();
1131 QDomElement ddElem = elem.firstChildElement( QStringLiteral(
"data-defined" ) );
1132 readOldDataDefinedPropertyMap(
nullptr, &ddElem );
1173 const QString calloutType = elem.attribute( QStringLiteral(
"calloutType" ) );
1174 if ( calloutType.isEmpty() )
1186 QDomElement textStyleElem = mFormat.
writeXml( doc, context );
1189 textStyleElem.setAttribute( QStringLiteral(
"fieldName" ),
fieldName );
1190 textStyleElem.setAttribute( QStringLiteral(
"isExpression" ),
isExpression );
1191 QDomElement replacementElem = doc.createElement( QStringLiteral(
"substitutions" ) );
1193 textStyleElem.appendChild( replacementElem );
1194 textStyleElem.setAttribute( QStringLiteral(
"useSubstitutions" ),
useSubstitutions );
1195 textStyleElem.setAttribute( QStringLiteral(
"legendString" ), mLegendString );
1198 QDomElement textFormatElem = doc.createElement( QStringLiteral(
"text-format" ) );
1199 textFormatElem.setAttribute( QStringLiteral(
"wrapChar" ),
wrapChar );
1200 textFormatElem.setAttribute( QStringLiteral(
"autoWrapLength" ),
autoWrapLength );
1202 textFormatElem.setAttribute( QStringLiteral(
"multilineAlign" ),
static_cast< unsigned int >(
multilineAlign ) );
1203 textFormatElem.setAttribute( QStringLiteral(
"addDirectionSymbol" ), mLineSettings.
addDirectionSymbol() );
1204 textFormatElem.setAttribute( QStringLiteral(
"leftDirectionSymbol" ), mLineSettings.
leftDirectionSymbol() );
1205 textFormatElem.setAttribute( QStringLiteral(
"rightDirectionSymbol" ), mLineSettings.
rightDirectionSymbol() );
1206 textFormatElem.setAttribute( QStringLiteral(
"reverseDirectionSymbol" ), mLineSettings.
reverseDirectionSymbol() );
1207 textFormatElem.setAttribute( QStringLiteral(
"placeDirectionSymbol" ),
static_cast< unsigned int >( mLineSettings.
directionSymbolPlacement() ) );
1208 textFormatElem.setAttribute( QStringLiteral(
"formatNumbers" ),
formatNumbers );
1209 textFormatElem.setAttribute( QStringLiteral(
"decimals" ),
decimals );
1210 textFormatElem.setAttribute( QStringLiteral(
"plussign" ),
plusSign );
1213 QDomElement placementElem = doc.createElement( QStringLiteral(
"placement" ) );
1214 placementElem.setAttribute( QStringLiteral(
"placement" ),
placement );
1215 placementElem.setAttribute( QStringLiteral(
"polygonPlacementFlags" ),
static_cast< int >( mPolygonPlacementFlags ) );
1216 placementElem.setAttribute( QStringLiteral(
"placementFlags" ),
static_cast< unsigned int >( mLineSettings.
placementFlags() ) );
1217 placementElem.setAttribute( QStringLiteral(
"centroidWhole" ),
centroidWhole );
1218 placementElem.setAttribute( QStringLiteral(
"centroidInside" ),
centroidInside );
1220 placementElem.setAttribute( QStringLiteral(
"fitInPolygonOnly" ),
fitInPolygonOnly );
1221 placementElem.setAttribute( QStringLiteral(
"dist" ),
dist );
1224 placementElem.setAttribute( QStringLiteral(
"offsetType" ),
static_cast< unsigned int >(
offsetType ) );
1225 placementElem.setAttribute( QStringLiteral(
"quadOffset" ),
static_cast< unsigned int >(
quadOffset ) );
1226 placementElem.setAttribute( QStringLiteral(
"xOffset" ),
xOffset );
1227 placementElem.setAttribute( QStringLiteral(
"yOffset" ),
yOffset );
1230 placementElem.setAttribute( QStringLiteral(
"rotationAngle" ),
angleOffset );
1231 placementElem.setAttribute( QStringLiteral(
"preserveRotation" ),
preserveRotation );
1232 placementElem.setAttribute( QStringLiteral(
"rotationUnit" ),
qgsEnumValueToKey( mRotationUnit ) );
1235 placementElem.setAttribute( QStringLiteral(
"priority" ),
priority );
1236 placementElem.setAttribute( QStringLiteral(
"repeatDistance" ),
repeatDistance );
1239 placementElem.setAttribute( QStringLiteral(
"overrunDistance" ), mLineSettings.
overrunDistance() );
1242 placementElem.setAttribute( QStringLiteral(
"lineAnchorPercent" ), mLineSettings.
lineAnchorPercent() );
1243 placementElem.setAttribute( QStringLiteral(
"lineAnchorType" ),
static_cast< int >( mLineSettings.
anchorType() ) );
1244 placementElem.setAttribute( QStringLiteral(
"lineAnchorClipping" ),
static_cast< int >( mLineSettings.
anchorClipping() ) );
1246 placementElem.setAttribute( QStringLiteral(
"geometryGenerator" ),
geometryGenerator );
1248 const QMetaEnum metaEnum( QMetaEnum::fromType<QgsWkbTypes::GeometryType>() );
1249 placementElem.setAttribute( QStringLiteral(
"geometryGeneratorType" ), metaEnum.valueToKey(
geometryGeneratorType ) );
1251 placementElem.setAttribute( QStringLiteral(
"layerType" ), metaEnum.valueToKey(
layerType ) );
1254 QDomElement renderingElem = doc.createElement( QStringLiteral(
"rendering" ) );
1255 renderingElem.setAttribute( QStringLiteral(
"drawLabels" ),
drawLabels );
1256 renderingElem.setAttribute( QStringLiteral(
"scaleVisibility" ),
scaleVisibility );
1257 renderingElem.setAttribute( QStringLiteral(
"scaleMin" ),
maximumScale );
1258 renderingElem.setAttribute( QStringLiteral(
"scaleMax" ),
minimumScale );
1259 renderingElem.setAttribute( QStringLiteral(
"fontLimitPixelSize" ),
fontLimitPixelSize );
1260 renderingElem.setAttribute( QStringLiteral(
"fontMinPixelSize" ),
fontMinPixelSize );
1261 renderingElem.setAttribute( QStringLiteral(
"fontMaxPixelSize" ),
fontMaxPixelSize );
1262 renderingElem.setAttribute( QStringLiteral(
"displayAll" ),
displayAll );
1263 renderingElem.setAttribute( QStringLiteral(
"upsidedownLabels" ),
static_cast< unsigned int >(
upsidedownLabels ) );
1265 renderingElem.setAttribute( QStringLiteral(
"labelPerPart" ),
labelPerPart );
1266 renderingElem.setAttribute( QStringLiteral(
"mergeLines" ), mLineSettings.
mergeLines() );
1267 renderingElem.setAttribute( QStringLiteral(
"minFeatureSize" ), mThinningSettings.
minimumFeatureSize() );
1269 renderingElem.setAttribute( QStringLiteral(
"maxNumLabels" ), mThinningSettings.
maximumNumberLabels() );
1270 renderingElem.setAttribute( QStringLiteral(
"obstacle" ), mObstacleSettings.
isObstacle() );
1271 renderingElem.setAttribute( QStringLiteral(
"obstacleFactor" ), mObstacleSettings.
factor() );
1272 renderingElem.setAttribute( QStringLiteral(
"obstacleType" ),
static_cast< unsigned int >( mObstacleSettings.
type() ) );
1273 renderingElem.setAttribute( QStringLiteral(
"zIndex" ),
zIndex );
1274 renderingElem.setAttribute( QStringLiteral(
"unplacedVisibility" ),
static_cast< int >( mUnplacedVisibility ) );
1276 QDomElement ddElem = doc.createElement( QStringLiteral(
"dd_properties" ) );
1277 mDataDefinedProperties.
writeXml( ddElem, *sPropertyDefinitions() );
1279 QDomElement elem = doc.createElement( QStringLiteral(
"settings" ) );
1280 elem.appendChild( textStyleElem );
1281 elem.appendChild( textFormatElem );
1282 elem.appendChild( placementElem );
1283 elem.appendChild( renderingElem );
1284 elem.appendChild( ddElem );
1288 elem.setAttribute( QStringLiteral(
"calloutType" ), mCallout->type() );
1289 mCallout->saveProperties( doc, elem, context );
1304 QPixmap pixmap( size );
1305 pixmap.fill( Qt::transparent );
1307 painter.begin( &pixmap );
1309 painter.setRenderHint( QPainter::Antialiasing );
1311 QRect rect( 0, 0, size.width(), size.height() );
1314 painter.setPen( Qt::NoPen );
1316 if ( ( background1.lightnessF() < 0.7 ) )
1318 background1 = background1.darker( 125 );
1322 background1 = background1.lighter( 125 );
1325 QLinearGradient linearGrad( QPointF( 0, 0 ), QPointF( 0, rect.height() ) );
1326 linearGrad.setColorAt( 0, background1 );
1327 linearGrad.setColorAt( 1, background2 );
1328 painter.setBrush( QBrush( linearGrad ) );
1329 if ( size.width() > 30 )
1331 painter.drawRoundedRect( rect, 6, 6 );
1336 painter.drawRect( rect );
1338 painter.setBrush( Qt::NoBrush );
1339 painter.setPen( Qt::NoPen );
1348 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
1349 const double logicalDpiX = QgsApplication::desktop()->logicalDpiX();
1351 QWidget *activeWindow = QApplication::activeWindow();
1352 const double logicalDpiX = activeWindow && activeWindow->screen() ? activeWindow->screen()->logicalDotsPerInchX() : 96.0;
1364 ? fontSize * tempFormat.
buffer().
size() / 100
1369 double ytrans = 0.0;
1372 ? fontSize * tempFormat.
buffer().
size() / 100
1377 const QStringList text = QStringList() << ( previewText.isEmpty() ? settings.
legendString() : previewText );
1379 QRectF textRect = rect;
1380 textRect.setLeft( xtrans + padding );
1381 textRect.setWidth( rect.width() - xtrans - 2 * padding );
1383 if ( textRect.width() > 2000 )
1384 textRect.setWidth( 2000 - 2 * padding );
1386 const double bottom = textRect.height() / 2 + textHeight / 2;
1387 textRect.setTop( bottom - textHeight );
1388 textRect.setBottom( bottom );
1399 QRectF labelRect( textRect.left() + ( textRect.width() - textWidth ) / 2.0, textRect.top(), textWidth, textRect.height() );
1406 if ( size.width() > 30 )
1411 rect.width() - iconWidth * 3, rect.height() - iconWidth * 3,
1412 iconWidth * 2, iconWidth * 2 ), Qt::AlignRight | Qt::AlignBottom );
1416 painter.setBrush( Qt::NoBrush );
1418 if ( size.width() > 30 )
1420 painter.drawRoundedRect( rect, 6, 6 );
1425 painter.drawRect( rect );
1434 return mUnplacedVisibility;
1439 mUnplacedVisibility = visibility;
1444 return QgsPalLabeling::checkMinimumSizeMM(
ct, geom, minSize );
1454 QString textCopy( text );
1457 std::unique_ptr< QgsRenderContext > scopedRc;
1462 scopedRc->expressionContext().setFeature( *f );
1578 if ( wrapchr.isEmpty() )
1580 wrapchr = QStringLiteral(
"\n" );
1585 && ( !leftDirSymb.isEmpty() || !rightDirSymb.isEmpty() ) )
1587 QString dirSym = leftDirSymb;
1589 if ( fm->horizontalAdvance( rightDirSymb ) > fm->horizontalAdvance( dirSym ) )
1590 dirSym = rightDirSymb;
1592 switch ( placeDirSymb )
1595 textCopy.append( dirSym );
1600 textCopy.prepend( dirSym + QStringLiteral(
"\n" ) );
1605 double w = 0.0, h = 0.0, rw = 0.0, rh = 0.0;
1606 double labelHeight = fm->ascent() + fm->descent();
1608 QStringList multiLineSplit;
1620 int lines = multiLineSplit.size();
1622 switch ( orientation )
1626 h += fm->height() +
static_cast< double >( ( lines - 1 ) * labelHeight * multilineH );
1628 for (
const auto &line : multiLineSplit )
1630 w = std::max( w, fm->horizontalAdvance( line ) );
1637 double letterSpacing = mFormat.
scaledFont( *context ).letterSpacing();
1638 double labelWidth = fm->maxWidth();
1639 w = labelWidth + ( lines - 1 ) * labelWidth * multilineH;
1641 int maxLineLength = 0;
1642 for (
const auto &line : multiLineSplit )
1644 maxLineLength = std::max( maxLineLength,
static_cast<int>( line.length() ) );
1646 h = fm->ascent() * maxLineLength + ( maxLineLength - 1 ) * letterSpacing;
1652 double widthHorizontal = 0.0;
1653 for (
const auto &line : multiLineSplit )
1655 widthHorizontal = std::max( w, fm->horizontalAdvance( line ) );
1658 double widthVertical = 0.0;
1659 double letterSpacing = mFormat.
scaledFont( *context ).letterSpacing();
1660 double labelWidth = fm->maxWidth();
1661 widthVertical = labelWidth + ( lines - 1 ) * labelWidth * multilineH;
1663 double heightHorizontal = 0.0;
1664 heightHorizontal += fm->height() +
static_cast< double >( ( lines - 1 ) * labelHeight * multilineH );
1666 double heightVertical = 0.0;
1667 int maxLineLength = 0;
1668 for (
const auto &line : multiLineSplit )
1670 maxLineLength = std::max( maxLineLength,
static_cast<int>( line.length() ) );
1672 heightVertical = fm->ascent() * maxLineLength + ( maxLineLength - 1 ) * letterSpacing;
1674 w = widthHorizontal;
1675 rw = heightVertical;
1676 h = heightHorizontal;
1684 labelX = std::fabs( ptSize.
x() -
ptZero.
x() );
1685 labelY = std::fabs( ptSize.
y() -
ptZero.
y() );
1690 if ( rotatedLabelX && rotatedLabelY )
1692 *rotatedLabelX = rw * uPP;
1693 *rotatedLabelY = rh * uPP;
1709 bool isObstacle = mObstacleSettings.
isObstacle();
1717 return registerObstacleFeature( f, context, obstacleGeometry );
1732 if ( obstacleGeometry.
isNull() )
1745 dataDefinedValues.clear();
1762 if ( useScaleVisibility )
1775 maxScale = 1 / std::fabs( maxScale );
1794 minScale = 1 / std::fabs( minScale );
1803 QFont labelFont = mFormat.
font();
1809 if ( !exprVal.isNull() )
1811 QString units = exprVal.toString();
1812 if ( !units.isEmpty() )
1822 double fontSize = mFormat.
size();
1828 if ( fontSize <= 0.0 )
1835 if ( fontPixelSize < 1 )
1839 labelFont.setPixelSize( fontPixelSize );
1851 if ( fontMinPixel > labelFont.pixelSize() || labelFont.pixelSize() > fontMaxPixel )
1863 labelFont.setCapitalization( QFont::MixedCase );
1865 parseTextStyle( labelFont, fontunits, context );
1868 parseTextFormatting( context );
1869 parseTextBuffer( context );
1870 parseTextMask( context );
1871 parseShapeBackground( context );
1872 parseDropShadow( context );
1893 labelText = result.isNull() ? QString() : result.toString();
1898 labelText = v.isNull() ? QString() : v.toString();
1918 if ( !exprVal.isNull() )
1920 QString fcase = exprVal.toString().trimmed();
1921 QgsDebugMsgLevel( QStringLiteral(
"exprVal FontCase:%1" ).arg( fcase ), 4 );
1923 if ( !fcase.isEmpty() )
1925 if ( fcase.compare( QLatin1String(
"NoChange" ), Qt::CaseInsensitive ) == 0 )
1929 else if ( fcase.compare( QLatin1String(
"Upper" ), Qt::CaseInsensitive ) == 0 )
1933 else if ( fcase.compare( QLatin1String(
"Lower" ), Qt::CaseInsensitive ) == 0 )
1937 else if ( fcase.compare( QLatin1String(
"Capitalize" ), Qt::CaseInsensitive ) == 0 )
1941 else if ( fcase.compare( QLatin1String(
"Title" ), Qt::CaseInsensitive ) == 0 )
1945 #if defined(HAS_KDE_QT5_SMALL_CAPS_FIX) || QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)
1946 else if ( fcase.compare( QLatin1String(
"SmallCaps" ), Qt::CaseInsensitive ) == 0 )
1950 else if ( fcase.compare( QLatin1String(
"AllSmallCaps" ), Qt::CaseInsensitive ) == 0 )
1966 if ( evalFormatNumbers )
1970 if ( decimalPlaces <= 0 )
1976 QVariant textV( labelText );
1978 double d = textV.toDouble( &ok );
1981 QString numberFormat;
1982 if ( d > 0 && signPlus )
1984 numberFormat.append(
'+' );
1986 numberFormat.append(
"%1" );
1987 labelText = numberFormat.arg( d, 0,
'f', decimalPlaces );
1992 std::unique_ptr<QFontMetricsF> labelFontMetrics(
new QFontMetricsF( labelFont ) );
1993 double labelX, labelY, rotatedLabelX, rotatedLabelY;
1996 if (
format().allowHtmlFormatting() )
2000 calculateLabelSize( labelFontMetrics.get(), labelText, labelX, labelY,
mCurFeat, &context, &rotatedLabelX, &rotatedLabelY,
format().allowHtmlFormatting() ? &doc :
nullptr );
2004 double maxcharanglein = 20.0;
2005 double maxcharangleout = -20.0;
2020 maxcharanglein = std::clamp(
static_cast< double >( maxcharanglePt.x() ), 20.0, 60.0 );
2021 maxcharangleout = std::clamp(
static_cast< double >( maxcharanglePt.y() ), 20.0, 95.0 );
2025 maxcharangleout = -( std::fabs( maxcharangleout ) );
2033 if ( !exprVal.isNull() )
2035 QString
str = exprVal.toString().trimmed();
2038 if ( !
str.isEmpty() )
2040 if (
str.compare( QLatin1String(
"Visible" ), Qt::CaseInsensitive ) == 0 )
2042 wholeCentroid =
false;
2044 else if (
str.compare( QLatin1String(
"Whole" ), Qt::CaseInsensitive ) == 0 )
2046 wholeCentroid =
true;
2060 std::unique_ptr<QgsGeometry> scopedClonedGeom;
2066 geom = simplifier.
simplify( geom );
2083 bool doClip =
false;
2084 if ( !centroidPoly || !wholeCentroid )
2090 QgsLabeling::PolygonPlacementFlags polygonPlacement = mPolygonPlacementFlags;
2094 if ( !dataDefinedOutside.isNull() )
2096 if ( dataDefinedOutside.type() == QVariant::String )
2098 const QString value = dataDefinedOutside.toString().trimmed();
2099 if ( value.compare( QLatin1String(
"force" ), Qt::CaseInsensitive ) == 0 )
2102 polygonPlacement &= ~static_cast< int >( QgsLabeling::PolygonPlacementFlag::AllowPlacementInsideOfPolygon );
2103 polygonPlacement |= QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon;
2105 else if ( value.compare( QLatin1String(
"yes" ), Qt::CaseInsensitive ) == 0 )
2108 polygonPlacement |= QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon;
2110 else if ( value.compare( QLatin1String(
"no" ), Qt::CaseInsensitive ) == 0 )
2113 polygonPlacement &= ~static_cast< int >( QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon );
2118 if ( dataDefinedOutside.toBool() )
2121 polygonPlacement |= QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon;
2126 polygonPlacement &= ~static_cast< int >( QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon );
2154 permissibleZone = geom;
2190 double minimumSize = 0.0;
2200 if ( !checkMinimumSizeMM( context, geom, featureThinningSettings.
minimumFeatureSize() ) )
2205 if ( !geos_geom_clone )
2234 bool layerDefinedRotation =
false;
2235 bool dataDefinedRotation =
false;
2236 double xPos = 0.0, yPos = 0.0,
angle = 0.0;
2237 double quadOffsetX = 0.0, quadOffsetY = 0.0;
2238 double offsetX = 0.0, offsetY = 0.0;
2250 bool ddFixedQuad =
false;
2256 if ( !exprVal.isNull() )
2259 int quadInt = exprVal.toInt( &ok );
2260 if ( ok && 0 <= quadInt && quadInt <= 8 )
2328 if ( !exprVal.isNull() )
2330 QString units = exprVal.toString().trimmed();
2331 if ( !units.isEmpty() )
2337 offUnit = decodedUnits;
2352 layerDefinedRotation =
true;
2362 if ( !exprVal.isNull() )
2365 const double rotation = exprVal.toDouble( &ok );
2368 dataDefinedRotation =
true;
2376 angle = ( 360 - rotationDegrees ) * M_PI / 180.0;
2381 bool hasDataDefinedPosition =
false;
2383 bool ddPosition =
false;
2390 if ( !xPosProperty.isNull()
2391 && !yPosProperty.isNull() )
2395 bool ddXPos =
false, ddYPos =
false;
2396 xPos = xPosProperty.toDouble( &ddXPos );
2397 yPos = yPosProperty.toDouble( &ddYPos );
2398 if ( ddXPos && ddYPos )
2399 hasDataDefinedPosition =
true;
2405 if ( !pointPosProperty.isNull() )
2415 if ( !referencedGeometryPoint.
isNull()
2419 else if ( pointPosProperty.canConvert<
QgsGeometry>() )
2426 hasDataDefinedPosition =
true;
2437 if ( hasDataDefinedPosition )
2440 if ( layerDefinedRotation && !dataDefinedRotation )
2449 if ( !exprVal.isNull() )
2451 QString haliString = exprVal.toString();
2452 if ( haliString.compare( QLatin1String(
"Center" ), Qt::CaseInsensitive ) == 0 )
2454 xdiff -= labelX / 2.0;
2456 else if ( haliString.compare( QLatin1String(
"Right" ), Qt::CaseInsensitive ) == 0 )
2467 if ( !exprVal.isNull() )
2469 QString valiString = exprVal.toString();
2470 if ( valiString.compare( QLatin1String(
"Bottom" ), Qt::CaseInsensitive ) != 0 )
2472 if ( valiString.compare( QLatin1String(
"Top" ), Qt::CaseInsensitive ) == 0 )
2478 double descentRatio = labelFontMetrics->descent() / labelFontMetrics->height();
2479 if ( valiString.compare( QLatin1String(
"Base" ), Qt::CaseInsensitive ) == 0 )
2481 ydiff -= labelY * descentRatio;
2485 double capHeightRatio = ( labelFontMetrics->boundingRect(
'H' ).height() + 1 + labelFontMetrics->descent() ) / labelFontMetrics->height();
2486 ydiff -= labelY * capHeightRatio;
2487 if ( valiString.compare( QLatin1String(
"Half" ), Qt::CaseInsensitive ) == 0 )
2489 ydiff += labelY * ( capHeightRatio - descentRatio ) / 2.0;
2497 if ( dataDefinedRotation )
2500 double xd = xdiff * std::cos(
angle ) - ydiff * std::sin(
angle );
2501 double yd = xdiff * std::sin(
angle ) + ydiff * std::cos(
angle );
2511 if (
const QgsPoint *point = qgsgeometry_cast< const QgsPoint * >( ddPoint.
constGet() ) )
2519 QgsMessageLog::logMessage( QObject::tr(
"Invalid data defined label position (%1, %2)" ).arg( xPos ).arg( yPos ), QObject::tr(
"Labeling" ) );
2520 hasDataDefinedPosition =
false;
2539 bool alwaysShow =
false;
2559 if ( !exprVal.isNull() )
2561 QString units = exprVal.toString().trimmed();
2562 if ( !units.isEmpty() )
2568 repeatUnits = decodedUnits;
2594 bool labelAll =
labelPerPart && !hasDataDefinedPosition;
2595 if ( !hasDataDefinedPosition )
2605 std::unique_ptr< QgsTextLabelFeature > labelFeature = std::make_unique< QgsTextLabelFeature>( feature.
id(), std::move( geos_geom_clone ), QSizeF( labelX, labelY ) );
2606 labelFeature->setAnchorPosition( anchorPosition );
2607 labelFeature->setFeature( feature );
2608 labelFeature->setSymbol( symbol );
2609 labelFeature->setDocument( doc );
2611 labelFeature->setRotatedSize( QSizeF( rotatedLabelX, rotatedLabelY ) );
2614 labelFeature->setHasFixedPosition( hasDataDefinedPosition );
2615 labelFeature->setFixedPosition(
QgsPointXY( xPos, yPos ) );
2617 labelFeature->setHasFixedAngle( dataDefinedRotation || ( !hasDataDefinedPosition && !
qgsDoubleNear(
angle, 0.0 ) ) );
2618 labelFeature->setFixedAngle(
angle );
2619 labelFeature->setQuadOffset( QPointF( quadOffsetX, quadOffsetY ) );
2620 labelFeature->setPositionOffset(
QgsPointXY( offsetX, offsetY ) );
2622 labelFeature->setAlwaysShow( alwaysShow );
2623 labelFeature->setRepeatDistance( repeatDist );
2624 labelFeature->setLabelText( labelText );
2625 labelFeature->setPermissibleZone( permissibleZone );
2626 labelFeature->setOverrunDistance( overrunDistanceEval );
2627 labelFeature->setOverrunSmoothDistance( overrunSmoothDist );
2630 labelFeature->setLabelAllParts( labelAll );
2632 labelFeature->setMinimumSize( minimumSize );
2636 labelFeature->setSymbolSize( QSizeF( obstacleGeometry.
boundingBox().
width(),
2642 double topMargin = std::max( 0.25 * labelFontMetrics->ascent(), 0.0 );
2643 double bottomMargin = 1.0 + labelFontMetrics->descent();
2644 QgsMargins vm( 0.0, topMargin, 0.0, bottomMargin );
2646 labelFeature->setVisualMargin( vm );
2649 QgsDebugMsgLevel( QStringLiteral(
"PAL font stored definedFont: %1, Style: %2" ).arg( labelFont.toString(), labelFont.styleName() ), 4 );
2650 labelFeature->setDefinedFont( labelFont );
2651 labelFeature->setFontMetrics( *labelFontMetrics );
2653 labelFeature->setMaximumCharacterAngleInside( std::clamp( maxcharanglein, 20.0, 60.0 ) * M_PI / 180 );
2654 labelFeature->setMaximumCharacterAngleOutside( std::clamp( maxcharangleout, -95.0, -20.0 ) * M_PI / 180 );
2678 double distance =
dist;
2690 if ( !exprVal.isNull() )
2692 QString units = exprVal.toString().trimmed();
2693 QgsDebugMsgLevel( QStringLiteral(
"exprVal DistanceUnits:%1" ).arg( units ), 4 );
2694 if ( !units.isEmpty() )
2700 distUnit = decodedUnits;
2713 distance = ( distance < 0 ? -1 : 1 ) * std::max( std::fabs( distance ), 1.0 );
2721 distance = std::max( distance, 2.0 );
2727 labelFeature->setDistLabel( d );
2732 labelFeature->setHasFixedQuadrant(
true );
2737 labelFeature->setPolygonPlacementFlags( polygonPlacement );
2746 labelFeature->setZIndex( z );
2753 if ( !exprVal.isNull() )
2756 double priorityD = exprVal.toDouble( &ok );
2759 priorityD = std::clamp( priorityD, 0.0, 10.0 );
2760 priorityD = 1 - priorityD / 10.0;
2761 labelFeature->setPriority( priorityD );
2770 labelFeature->setObstacleSettings( os );
2773 if ( positionOrder.isEmpty() )
2774 positionOrder = *DEFAULT_PLACEMENT_ORDER();
2780 if ( !dataDefinedOrder.isEmpty() )
2785 labelFeature->setPredefinedPositionOrder( positionOrder );
2788 labelFeature->setDataDefinedValues( dataDefinedValues );
2790 return labelFeature;
2798 if ( !obstacleGeometry.
isNull() )
2800 geom = obstacleGeometry;
2815 if ( ls->numPoints() < 2 )
2821 std::unique_ptr<QgsGeometry> scopedClonedGeom;
2827 geom = simplifier.
simplify( geom );
2831 std::unique_ptr<QgsGeometry> scopedPreparedGeom;
2839 if ( !geos_geom_clone )
2843 std::unique_ptr< QgsLabelFeature > obstacleFeature = std::make_unique< QgsLabelFeature >( f.
id(), std::move( geos_geom_clone ), QSizeF( 0, 0 ) );
2844 obstacleFeature->setFeature( f );
2849 obstacleFeature->setObstacleSettings( os );
2852 return obstacleFeature;
2855 bool QgsPalLayerSettings::dataDefinedValEval( DataDefinedValueType valType,
2859 if ( !mDataDefinedProperties.
isActive( p ) )
2863 exprVal = mDataDefinedProperties.
value( p, context );
2864 if ( !exprVal.isNull() )
2870 bool bol = exprVal.toBool();
2871 dataDefinedValues.insert( p, QVariant( bol ) );
2877 int size = exprVal.toInt( &ok );
2881 dataDefinedValues.insert( p, QVariant( size ) );
2889 int size = exprVal.toInt( &ok );
2891 if ( ok && size > 0 )
2893 dataDefinedValues.insert( p, QVariant( size ) );
2901 double size = exprVal.toDouble( &ok );
2905 dataDefinedValues.insert( p, QVariant( size ) );
2913 double size = exprVal.toDouble( &ok );
2915 if ( ok && size > 0.0 )
2917 dataDefinedValues.insert( p, QVariant( size ) );
2925 double rot = exprVal.toDouble( &ok );
2928 if ( rot < -180.0 && rot >= -360 )
2932 if ( rot > 180.0 && rot <= 360 )
2936 if ( rot >= -180 && rot <= 180 )
2938 dataDefinedValues.insert( p, QVariant( rot ) );
2947 int size = exprVal.toInt( &ok );
2948 if ( ok && size >= 0 && size <= 100 )
2950 dataDefinedValues.insert( p, QVariant( size ) );
2957 QString
str = exprVal.toString();
2959 dataDefinedValues.insert( p, QVariant(
str ) );
2964 QString unitstr = exprVal.toString().trimmed();
2966 if ( !unitstr.isEmpty() )
2975 QString colorstr = exprVal.toString().trimmed();
2978 if ( color.isValid() )
2980 dataDefinedValues.insert( p, QVariant( color ) );
2987 QString joinstr = exprVal.toString().trimmed();
2989 if ( !joinstr.isEmpty() )
2998 QString blendstr = exprVal.toString().trimmed();
3000 if ( !blendstr.isEmpty() )
3013 dataDefinedValues.insert( p, res );
3024 dataDefinedValues.insert( p, res );
3034 void QgsPalLayerSettings::parseTextStyle( QFont &labelFont,
3047 QString ddFontFamily;
3052 if ( !exprVal.isNull() )
3054 QString family = exprVal.toString().trimmed();
3055 QgsDebugMsgLevel( QStringLiteral(
"exprVal Font family:%1" ).arg( family ), 4 );
3057 if ( labelFont.family() != family )
3063 ddFontFamily = family;
3070 QString ddFontStyle;
3074 if ( !exprVal.isNull() )
3076 QString fontstyle = exprVal.toString().trimmed();
3077 QgsDebugMsgLevel( QStringLiteral(
"exprVal Font style:%1" ).arg( fontstyle ), 4 );
3078 ddFontStyle = fontstyle;
3083 bool ddBold =
false;
3091 bool ddItalic =
false;
3101 QFont appFont = QApplication::font();
3102 bool newFontBuilt =
false;
3103 if ( ddBold || ddItalic )
3106 newFont = QFont( !ddFontFamily.isEmpty() ? ddFontFamily : labelFont.family() );
3107 newFontBuilt =
true;
3108 newFont.setBold( ddBold );
3109 newFont.setItalic( ddItalic );
3111 else if ( !ddFontStyle.isEmpty()
3112 && ddFontStyle.compare( QLatin1String(
"Ignore" ), Qt::CaseInsensitive ) != 0 )
3114 if ( !ddFontFamily.isEmpty() )
3118 mFontDB = std::make_unique< QFontDatabase >();
3120 QFont styledfont = mFontDB->font( ddFontFamily, ddFontStyle, appFont.pointSize() );
3121 if ( appFont != styledfont )
3123 newFont = styledfont;
3124 newFontBuilt =
true;
3131 else if ( !ddFontFamily.isEmpty() )
3133 if ( ddFontStyle.compare( QLatin1String(
"Ignore" ), Qt::CaseInsensitive ) != 0 )
3137 mFontDB = std::make_unique< QFontDatabase >();
3138 QFont styledfont = mFontDB->font( ddFontFamily, mFormat.
namedStyle(), appFont.pointSize() );
3139 if ( appFont != styledfont )
3141 newFont = styledfont;
3142 newFontBuilt =
true;
3147 newFont = QFont( ddFontFamily );
3148 newFontBuilt =
true;
3156 newFont.setPixelSize( labelFont.pixelSize() );
3157 newFont.setUnderline( labelFont.underline() );
3158 newFont.setStrikeOut( labelFont.strikeOut() );
3159 newFont.setWordSpacing( labelFont.wordSpacing() );
3160 newFont.setLetterSpacing( QFont::AbsoluteSpacing, labelFont.letterSpacing() );
3162 labelFont = newFont;
3166 double wordspace = labelFont.wordSpacing();
3175 double letterspace = labelFont.letterSpacing();
3188 labelFont.setStrikeOut( strikeout );
3203 labelFont.setUnderline( underline );
3229 drawBuffer = exprVal.toBool();
3242 double bufrSize = buffer.
size();
3245 bufrSize = exprVal.toDouble();
3249 double bufferOpacity = buffer.
opacity() * 100;
3252 bufferOpacity = exprVal.toDouble();
3255 drawBuffer = ( drawBuffer && bufrSize > 0.0 && bufferOpacity > 0 );
3285 bool maskEnabled = mask.
enabled();
3288 maskEnabled = exprVal.toBool();
3297 double bufrSize = mask.
size();
3300 bufrSize = exprVal.toDouble();
3304 double opacity = mask.
opacity() * 100;
3307 opacity = exprVal.toDouble();
3310 maskEnabled = ( maskEnabled && bufrSize > 0.0 && opacity > 0 );
3335 wrapchr = exprVal.toString();
3341 evalAutoWrapLength = exprVal.toInt();
3352 if ( !exprVal.isNull() )
3354 QString
str = exprVal.toString().trimmed();
3357 if ( !
str.isEmpty() )
3362 if (
str.compare( QLatin1String(
"Center" ), Qt::CaseInsensitive ) == 0 )
3366 else if (
str.compare( QLatin1String(
"Right" ), Qt::CaseInsensitive ) == 0 )
3370 else if (
str.compare( QLatin1String(
"Follow" ), Qt::CaseInsensitive ) == 0 )
3374 else if (
str.compare( QLatin1String(
"Justify" ), Qt::CaseInsensitive ) == 0 )
3389 if ( !exprVal.isNull() )
3391 QString
str = exprVal.toString().trimmed();
3392 if ( !
str.isEmpty() )
3401 drawDirSymb = exprVal.toBool();
3414 if ( !exprVal.isNull() )
3416 QString
str = exprVal.toString().trimmed();
3419 if ( !
str.isEmpty() )
3424 if (
str.compare( QLatin1String(
"Above" ), Qt::CaseInsensitive ) == 0 )
3428 else if (
str.compare( QLatin1String(
"Below" ), Qt::CaseInsensitive ) == 0 )
3443 void QgsPalLayerSettings::parseShapeBackground(
QgsRenderContext &context )
3450 bool drawShape = background.
enabled();
3453 drawShape = exprVal.toBool();
3462 double shapeOpacity = background.
opacity() * 100;
3465 shapeOpacity = 100.0 * exprVal.toDouble();
3468 drawShape = ( drawShape && shapeOpacity > 0 );
3482 if ( !exprVal.isNull() )
3484 QString skind = exprVal.toString().trimmed();
3485 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeKind:%1" ).arg( skind ), 4 );
3487 if ( !skind.isEmpty() )
3496 QString svgPath = background.
svgFile();
3501 if ( !exprVal.isNull() )
3503 QString svgfile = exprVal.toString().trimmed();
3504 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeSVGFile:%1" ).arg( svgfile ), 4 );
3517 if ( !exprVal.isNull() )
3519 QString stype = exprVal.toString().trimmed();
3520 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeSizeType:%1" ).arg( stype ), 4 );
3522 if ( !stype.isEmpty() )
3531 double ddShpSizeX = background.
size().width();
3534 ddShpSizeX = exprVal.toDouble();
3538 double ddShpSizeY = background.
size().height();
3541 ddShpSizeY = exprVal.toDouble();
3547 && ( svgPath.isEmpty()
3548 || ( !svgPath.isEmpty()
3550 && ddShpSizeX == 0.0 ) ) )
3558 && ddShpSizeX == 0.0 ) ) )
3565 && ( ddShpSizeX == 0.0 || ddShpSizeY == 0.0 ) )
3588 if ( !exprVal.isNull() )
3590 QString rotstr = exprVal.toString().trimmed();
3591 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeRotationType:%1" ).arg( rotstr ), 4 );
3593 if ( !rotstr.isEmpty() )
3644 bool drawShadow = shadow.
enabled();
3647 drawShadow = exprVal.toBool();
3656 double shadowOpacity = shadow.
opacity() * 100;
3659 shadowOpacity = exprVal.toDouble();
3666 shadowOffDist = exprVal.toDouble();
3673 shadowRad = exprVal.toDouble();
3676 drawShadow = ( drawShadow && shadowOpacity > 0 && !( shadowOffDist == 0.0 && shadowRad == 0.0 ) );
3691 if ( !exprVal.isNull() )
3693 QString
str = exprVal.toString().trimmed();
3696 if ( !
str.isEmpty() )
3731 switch ( layer->
type() )
3735 const QgsVectorLayer *vl = qobject_cast< const QgsVectorLayer * >( layer );
3746 return !labeling->styles().empty();
3795 QStringList
QgsPalLabeling::splitToLines(
const QString &text,
const QString &wrapCharacter,
const int autoWrapLength,
const bool useMaxLineLengthWhenAutoWrapping )
3797 QStringList multiLineSplit;
3798 if ( !wrapCharacter.isEmpty() && wrapCharacter != QLatin1String(
"\n" ) )
3801 const QStringList lines = text.split( wrapCharacter );
3802 for (
const QString &line : lines )
3804 multiLineSplit.append( line.split(
'\n' ) );
3809 multiLineSplit = text.split(
'\n' );
3813 if ( autoWrapLength != 0 )
3815 QStringList autoWrappedLines;
3816 autoWrappedLines.reserve( multiLineSplit.count() );
3817 for (
const QString &line : std::as_const( multiLineSplit ) )
3819 autoWrappedLines.append(
QgsStringUtils::wordWrap( line, autoWrapLength, useMaxLineLengthWhenAutoWrapping ).split(
'\n' ) );
3821 multiLineSplit = autoWrappedLines;
3823 return multiLineSplit;
3828 QStringList graphemes;
3829 QTextBoundaryFinder boundaryFinder( QTextBoundaryFinder::Grapheme, text );
3830 int currentBoundary = -1;
3831 int previousBoundary = 0;
3832 while ( ( currentBoundary = boundaryFinder.toNextBoundary() ) > 0 )
3834 graphemes << text.mid( previousBoundary, currentBoundary - previousBoundary );
3835 previousBoundary = currentBoundary;
3865 QgsDebugMsgLevel( QStringLiteral(
"Ignoring feature due to transformation exception" ), 4 );
3871 return std::isfinite( point.
x() ) && std::isfinite( point.
y() );
3875 cp->removeInvalidRings();
3877 else if (
QgsMultiSurface *ms = qgsgeometry_cast< QgsMultiSurface * >( geom.
get() ) )
3879 for (
int i = 0; i < ms->numGeometries(); ++i )
3881 if (
QgsCurvePolygon *cp = qgsgeometry_cast< QgsCurvePolygon * >( ms->geometryN( i ) ) )
3882 cp->removeInvalidRings();
3894 QgsDebugMsg( QStringLiteral(
"Error rotating geometry" ).arg( geom.
asWkt() ) );
3899 #if GEOS_VERSION_MAJOR>3 || ( GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR>=9 )
3901 const bool mustClip = ( !clipGeometry.
isNull() &&
3905 bool mustClipExact =
false;
3929 QVector< QgsGeometry> parts;
3930 parts.reserve( qgsgeometry_cast< const QgsGeometryCollection * >( geom.
constGet() )->numGeometries() );
3939 parts.append( partGeom );
3947 if ( bufferGeom.
isNull() )
3949 QgsDebugMsg( QStringLiteral(
"Could not repair geometry: %1" ).arg( bufferGeom.
lastError() ) );
3956 if ( mustClipExact )
3976 QVector< QgsGeometry> parts;
3977 parts.reserve( qgsgeometry_cast< const QgsGeometryCollection * >( geom.
constGet() )->numGeometries() );
3983 partGeom = partGeom.
buffer( 0, 0 );
3985 parts.append( partGeom );
3992 if ( bufferGeom.
isNull() )
3994 QgsDebugMsg( QStringLiteral(
"Could not repair geometry: %1" ).arg( bufferGeom.
lastError() ) );
4001 if ( !clipGeometry.
isNull() &&
4038 double length = geom.
length();
4039 if ( length >= 0.0 )
4041 return ( length >= ( minSize * mapUnitsPerMM ) );
4046 double area = geom.
area();
4049 return ( std::sqrt( area ) >= ( minSize * mapUnitsPerMM ) );
4057 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4060 bool changed =
false;
4066 format.
setColor( ddColor.value<QColor>() );
4091 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4153 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4156 bool changed =
false;
4204 buffer.
setColor( ddColor.value<QColor>() );
4231 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4233 if ( ddValues.isEmpty() )
4237 bool changed =
false;
4297 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4300 bool changed =
false;
4340 QSizeF size = background.
size();
4347 QSizeF size = background.
size();
4448 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4451 bool changed =
false;
4510 shadow.
setColor( ddColor.value<QColor>() );
4550 double cx = lp->
getX() + w / 2.0;
4551 double cy = lp->
getY() + h / 2.0;
4554 double sw = w * scale;
4555 double sh = h * scale;
4556 QRectF rect( -sw / 2, -sh / 2, sw, sh );
4558 painter->translate( xform->
transform( QPointF( cx, cy ) ).toQPointF() );
4562 if ( lp->
getFeaturePart()->getLayer()->getArrangement() != P_POINT &&
4563 lp->
getFeaturePart()->getLayer()->getArrangement() != P_POINT_OVER &&
4566 painter->rotate( rotation );
4569 painter->translate( rect.bottomLeft() );
4570 painter->rotate( -lp->
getAlpha() * 180 / M_PI );
4571 painter->translate( -rect.bottomLeft() );
4574 QRectF rect( 0, 0, outPt2.
x() - outPt.
x(), outPt2.
y() - outPt.
y() );
4575 painter->translate( QPointF( outPt.
x(), outPt.
y() ) );
4576 painter->rotate( -lp->
getAlpha() * 180 / M_PI );
4581 painter->setPen( QColor( 255, 0, 0, 64 ) );
4585 painter->setPen( QColor( 0, 0, 0, 64 ) );
4587 painter->drawRect( rect );
4591 rect.moveTo( outPt.
x(), outPt.
y() );
@ Success
Operation succeeded.
@ 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.
UnplacedLabelVisibility
Unplaced label visibility.
@ FollowEngineSetting
Respect the label engine setting.
@ Antialiasing
Use antialiasing while drawing.
static const double UI_SCALE_FACTOR
UI scaling factor.
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 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.
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.
QgsGeometry intersection(const QgsGeometry &geometry) const
Returns a geometry representing the points shared by this geometry and other.
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.
QgsWkbTypes::GeometryType type
double area() const
Returns the planar, 2-dimensional area of the geometry.
QgsGeometry centroid() const
Returns the center of mass of a geometry.
QgsGeometry makeValid() const
Attempts to make an invalid geometry valid without losing vertices.
QString lastError() const SIP_HOLDGIL
Returns an error string referring to the last error encountered either when this geometry was created...
QgsGeometry mergeLines() const
Merges any connected lines in a LineString/MultiLineString geometry and converts them to single line ...
QgsGeometry buffer(double distance, int segments) const
Returns a buffer region around this geometry having the given width and with a specified number of se...
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.
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.
bool convertGeometryCollectionToSubclass(QgsWkbTypes::GeometryType geomType)
Converts geometry collection to a the desired geometry type subclass (multi-point,...
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.
QString leftDirectionSymbol() const
Returns the string to use for left direction arrows.
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.
double overrunDistance() const
Returns the distance which labels are allowed to overrun past the start or end of line features.
QgsUnitTypes::RenderUnit overrunDistanceUnit() const
Returns the units for label overrun distance.
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.
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 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 setOverrunDistanceUnit(const QgsUnitTypes::RenderUnit &unit)
Sets the unit for label overrun distance.
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.
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 QVector< QgsPalLayerSettings::PredefinedPointPosition > decodePredefinedPositionOrder(const QString &positionString)
Decodes a string to an ordered list of predefined point label positions.
static QString encodePredefinedPositionOrder(const QVector< QgsPalLayerSettings::PredefinedPointPosition > &positions)
Encodes an ordered list of predefined point label positions to a string.
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.
double extentBuffer() const
Returns the buffer in map units to use around the visible extent for rendering symbols whose correspo...
const QgsMapToPixel & mapToPixel() const
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.
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.
bool displayAll
If true, all features will be labelled even when overlaps occur.
QString wrapChar
Wrapping character string.
QSet< QString > referencedFields(const QgsRenderContext &context) const
Returns all field names referenced by the configuration (e.g.
double xOffset
Horizontal offset of label.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the label's property collection, used for data defined overrides.
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
QuadrantPosition quadOffset
Sets the quadrant in which to offset labels from feature.
double minimumScale
The minimum map scale (i.e.
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)
Calculates the space required to render the provided text in map units.
void registerFeature(const QgsFeature &f, QgsRenderContext &context)
Registers a feature for labeling.
@ Upright
Upside-down labels (90 <= angle < 270) are shown upright.
QgsPalLayerSettings & operator=(const QgsPalLayerSettings &s)
copy operator - only copies the permanent members
QgsWkbTypes::GeometryType geometryGeneratorType
The type of the result geometry of the geometry generator.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Read settings from a DOM element.
QgsUnitTypes::RenderUnit offsetUnits
Units for offsets of label.
bool scaleVisibility
Set to true to limit label visibility to a range of scales.
QgsCallout * callout() const
Returns the label callout renderer, responsible for drawing label callouts.
double repeatDistance
Distance for repeating labels for a single feature.
QgsUnitTypes::AngleUnit rotationUnit() const
Unit for rotation of labels.
bool geometryGeneratorEnabled
Defines if the geometry generator is enabled or not. If disabled, the standard geometry will be taken...
Placement
Placement modes which determine how label candidates are generated for a feature.
@ PerimeterCurved
Arranges candidates following the curvature of a polygon's boundary. Applies to polygon layers only.
@ Curved
Arranges candidates following the curvature of a line feature. Applies to line layers only.
@ Horizontal
Arranges horizontal candidates scattered throughout a polygon feature. Applies to polygon layers only...
@ Free
Arranges candidates scattered throughout a polygon feature. Candidates are rotated to respect the pol...
@ OverPoint
Arranges candidates over a point (or centroid of a polygon), or at a preset offset from the point....
@ 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'...
@ OrderedPositionsAroundPoint
Candidates are placed in predefined positions around a point. Preference is given to positions with g...
@ OutsidePolygons
Candidates are placed outside of polygon boundaries. Applies to polygon layers only....
QVector< PredefinedPointPosition > predefinedPositionOrder
Ordered list of predefined label positions for points.
bool centroidInside
true if centroid positioned labels must be placed inside their corresponding feature polygon,...
int priority
Label priority.
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.
QgsUnitTypes::RenderUnit distUnits
Units the distance from feature to the label.
@ BottomSlightlyRight
Label below point, slightly right of center.
@ MiddleLeft
Label on left of point.
@ TopSlightlyRight
Label on top of point, slightly right of center.
@ MiddleRight
Label on right of point.
@ BottomRight
Label on bottom right of point.
@ BottomLeft
Label on bottom-left of point.
@ TopRight
Label on top-right of point.
@ TopLeft
Label on top-left of point.
QgsUnitTypes::RenderUnit repeatDistanceUnit
Units for repeating labels for a single feature.
OffsetType offsetType
Offset type for layer (only applies in certain placement modes)
MultiLineAlign multilineAlign
Horizontal alignment of multi-line labels.
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)
Property
Data definable properties.
@ MaskEnabled
Whether the mask is enabled.
@ LabelRotation
Label rotation.
@ PositionY
Y-coordinate data defined label position.
@ 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.
@ 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.
@ 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.
@ LinePlacementOptions
Line placement flags.
@ Vali
Vertical alignment for data defined label position (Bottom, Base, Half, Cap, Top)
@ FontOpacity
Text opacity.
const QgsLabelLineSettings & lineSettings() const
Returns the label line settings, which contain settings related to how the label engine places and fo...
void setRotationUnit(QgsUnitTypes::AngleUnit angleUnit)
Set unit for rotation of labels.
OffsetType
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.
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.
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.
QgsMapUnitScale repeatDistanceMapUnitScale
Map unit scale for repeating labels for a single feature.
bool centroidWhole
true if feature centroid should be calculated from the whole feature, or false if only the visible pa...
const QgsTextFormat & format() const
Returns the label text formatting settings, e.g., font settings, buffer settings, etc.
UpsideDownLabels 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,...
QgsWkbTypes::GeometryType layerType
Geometry type of layers associated with these settings.
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.
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 rendererScale() const
Returns the renderer map scale.
QgsExpressionContext & expressionContext()
Gets the expression context.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
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)
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
double convertToMapUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to map units.
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
const QgsVectorSimplifyMethod & vectorSimplifyMethod() const
Returns the simplification settings to use when rendering vector layers.
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.
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.
void setRadiiUnit(QgsUnitTypes::RenderUnit units)
Sets the units used for the shape's radii.
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 setStrokeWidthUnit(QgsUnitTypes::RenderUnit units)
Sets the units used for the shape's stroke width.
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).
QgsUnitTypes::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 setOffset(QPointF offset)
Sets the offset used for drawing the background shape.
void setSize(QSizeF size)
Sets the size of the background shape.
void setSizeUnit(QgsUnitTypes::RenderUnit unit)
Sets the units used for the shape's size.
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.
void setOffsetUnit(QgsUnitTypes::RenderUnit units)
Sets the units used for the shape's offset.
Container for settings relating to a text buffer.
void setBlendMode(QPainter::CompositionMode mode)
Sets the blending mode used for drawing the buffer.
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 setEnabled(bool enabled)
Sets whether the text buffer will be drawn.
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units for the buffer size.
QColor color() const
Returns the color of the buffer.
void setSizeUnit(QgsUnitTypes::RenderUnit unit)
Sets the units used for the buffer size.
void setJoinStyle(Qt::PenJoinStyle style)
Sets the join style used for drawing the buffer.
void setSize(double size)
Sets the size of the buffer.
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...
QStringList toPlainText() const
Returns a list of plain text lines of text representing the document.
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.
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.
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units for the size of rendered text.
int stretchFactor() const
Returns the text's stretch factor.
void setOrientation(TextOrientation orientation)
Sets the orientation for the text.
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.
TextOrientation orientation() const
Returns the orientation of the 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.
TextOrientation
Text orientation.
@ HorizontalOrientation
Vertically oriented text.
@ RotationBasedOrientation
Horizontally or vertically oriented text based on rotation (only available for map labeling)
@ VerticalOrientation
Horizontally oriented text.
double opacity() const
Returns the text's opacity.
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 QFontMetricsF &fontMetrics, double letterSpacing, double wordSpacing, const QString &text=QString(), QgsTextDocument *document=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 setSizeUnit(QgsUnitTypes::RenderUnit unit)
Sets the units used for the buffer size.
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.
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 QString encodeTextOrientation(QgsTextFormat::TextOrientation orientation)
Encodes a text orientation.
static QgsTextFormat::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 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 void drawText(const QRectF &rect, double rotation, HAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, VAlignment vAlignment=AlignTop, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags())
Draws text within a rectangle using the specified settings.
@ AlignCenter
Center align.
static int sizeToPixel(double size, const QgsRenderContext &c, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &mapUnitScale=QgsMapUnitScale())
Calculates pixel size (considering output size should be in pixel or map units, scale factors and opt...
static double textHeight(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, DrawMode mode=Point, QFontMetricsF *fontMetrics=nullptr, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), double maxLineWidth=0)
Returns the height of a text based on a given format.
@ Rect
Text within rectangle draw mode.
Container for settings relating to a text shadow.
int offsetAngle() const
Returns the angle for offsetting the position of the shadow from the text.
bool enabled() const
Returns whether the shadow is enabled.
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.
void setBlurRadiusUnit(QgsUnitTypes::RenderUnit units)
Sets the units used for the shadow's blur radius.
double blurRadius() const
Returns the blur radius for the shadow.
void setBlurRadius(double blurRadius)
Sets the blur radius for the shadow.
void setOffsetUnit(QgsUnitTypes::RenderUnit units)
Sets the units used for the shadow's offset.
void setEnabled(bool enabled)
Sets whether the text shadow will be drawn.
AngleUnit
Units of angles.
static Q_INVOKABLE QString encodeUnit(QgsUnitTypes::DistanceUnit unit)
Encodes a distance unit to a string.
static Q_INVOKABLE double fromUnitToUnitFactor(QgsUnitTypes::DistanceUnit fromUnit, QgsUnitTypes::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
static Q_INVOKABLE QgsUnitTypes::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
RenderUnit
Rendering size units.
@ RenderPercentage
Percentage of another measurement (e.g., canvas size, feature size)
@ RenderPoints
Points (e.g., for font sizes)
@ RenderMillimeters
Millimeters.
@ RenderMapUnits
Map units.
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.
Q_INVOKABLE QgsWkbTypes::GeometryType geometryType() const
Returns point, line or polygon.
bool diagramsEnabled() const
Returns whether the layer contains diagrams which are enabled and should be drawn.
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.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
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.
LabelPosition * nextPart() const
Returns the next part of this label position (i.e.
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.
@ PointCloudLayer
Point cloud layer. Added in QGIS 3.18.
@ MeshLayer
Mesh layer. Added in QGIS 3.2.
@ VectorLayer
Vector layer.
@ RasterLayer
Raster layer.
@ GroupLayer
Composite group layer. Added in QGIS 3.24.
@ VectorTileLayer
Vector tile layer. Added in QGIS 3.14.
@ AnnotationLayer
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
@ PluginLayer
Plugin based layer.
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.
#define Q_NOWARN_DEPRECATED_POP
QString qgsEnumValueToKey(const T &value)
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)
T qgsEnumKeyToValue(const QString &key, const T &defaultValue, bool tryValueAsKey=true)
Returns the value corresponding to the given key of an enum.
Q_GLOBAL_STATIC(QReadWriteLock, sDefinitionCacheLock)
#define QgsDebugMsgLevel(str, level)
QString updateDataDefinedString(const QString &value)
Q_GLOBAL_STATIC_WITH_ARGS(PredefinedPointPositionVector, DEFAULT_PLACEMENT_ORDER,({ QgsPalLayerSettings::TopRight, QgsPalLayerSettings::TopLeft, QgsPalLayerSettings::BottomRight, QgsPalLayerSettings::BottomLeft, QgsPalLayerSettings::MiddleRight, QgsPalLayerSettings::MiddleLeft, QgsPalLayerSettings::TopSlightlyRight, QgsPalLayerSettings::BottomSlightlyRight })) void QgsPalLayerSettings
QVector< QgsPalLayerSettings::PredefinedPointPosition > PredefinedPointPositionVector
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
const QgsCoordinateReferenceSystem & crs