36 #include <QApplication>
39 #include <QFontMetrics>
42 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
43 #include <QDesktopWidget>
48 #include <QTextBoundaryFinder>
114 if ( !sPropertyDefinitions()->isEmpty() )
117 const QString origin = QStringLiteral(
"labeling" );
129 "e.g. Helvetica or Helvetica [Cronyx]" ), origin )
133 "e.g. Bold Condensed or Light Italic" ), origin )
173 "<b>Ellipse</b>|<b>Circle</b>|<b>SVG</b>]" ), origin )
197 "<b>Buffer</b>|<b>Background</b>]" ), origin )
213 "<b>3</b>=Left|<b>4</b>=Over|<b>5</b>=Right|<br>"
214 "<b>6</b>=Below Left|<b>7</b>=Below|<b>8</b>=Below Right]" ), origin )
232 + QStringLiteral(
"[<b>TL</b>=Top left|<b>TSL</b>=Top, slightly left|<b>T</b>=Top middle|<br>"
233 "<b>TSR</b>=Top, slightly right|<b>TR</b>=Top right|<br>"
234 "<b>L</b>=Left|<b>R</b>=Right|<br>"
235 "<b>BL</b>=Bottom left|<b>BSL</b>=Bottom, slightly left|<b>B</b>=Bottom middle|<br>"
236 "<b>BSR</b>=Bottom, slightly right|<b>BR</b>=Bottom right]" ), origin )
240 + QStringLiteral(
"[<b>OL</b>=On line|<b>AL</b>=Above line|<b>BL</b>=Below line|<br>"
241 "<b>LO</b>=Respect line orientation]" ), origin )
249 "<b>Half</b>|<b>Cap</b>|<b>Top</b>]" ), origin )
272 : predefinedPositionOrder( *DEFAULT_PLACEMENT_ORDER() )
275 initPropertyDefinitions();
284 , mDataDefinedProperties( s.mDataDefinedProperties )
319 mPolygonPlacementFlags = s.mPolygonPlacementFlags;
335 mRotationUnit = s.mRotationUnit;
357 mDataDefinedProperties = s.mDataDefinedProperties;
359 mCallout.reset( s.mCallout ? s.mCallout->clone() :
nullptr );
361 mLineSettings = s.mLineSettings;
362 mObstacleSettings = s.mObstacleSettings;
363 mThinningSettings = s.mThinningSettings;
370 mLegendString = s.mLegendString;
372 mUnplacedVisibility = s.mUnplacedVisibility;
422 for (
const QString &name : referencedColumns )
424 attributeNames.insert( name );
483 for (
const QString &name : referencedColumns )
485 attributeNames.insert( name );
492 const auto referencedColumns = mCallout->referencedFields( context );
493 for (
const QString &name : referencedColumns )
495 attributeNames.insert( name );
504 QSet<QString> referenced;
532 referenced.unite( mCallout->referencedFields( context ) );
540 if ( mRenderStarted )
542 qWarning(
"Start render called for when a previous render was already underway!!" );
555 mCallout->startRender( context );
558 mRenderStarted =
true;
563 if ( !mRenderStarted )
565 qWarning(
"Stop render called for QgsPalLayerSettings without a startRender call!" );
571 mCallout->stopRender( context );
574 mRenderStarted =
false;
584 if ( mRenderStarted )
586 qWarning(
"stopRender was not called on QgsPalLayerSettings object!" );
597 initPropertyDefinitions();
598 return *sPropertyDefinitions();
612 return mRotationUnit;
617 mRotationUnit = angleUnit;
623 QString newValue = value;
624 if ( !value.isEmpty() && !value.contains( QLatin1String(
"~~" ) ) )
627 values << QStringLiteral(
"1" );
628 values << QStringLiteral(
"0" );
631 newValue = values.join( QLatin1String(
"~~" ) );
639 QString newPropertyName =
"labeling/dataDefined/" + sPropertyDefinitions()->value( p ).name();
640 QVariant newPropertyField = layer->
customProperty( newPropertyName, QVariant() );
642 if ( !newPropertyField.isValid() )
645 QString ddString = newPropertyField.toString();
647 if ( !ddString.isEmpty() && ddString != QLatin1String(
"0~~0~~~~" ) )
651 QStringList ddv = newStyleString.split( QStringLiteral(
"~~" ) );
653 bool active = ddv.at( 0 ).toInt();
654 if ( ddv.at( 1 ).toInt() )
670 void QgsPalLayerSettings::readOldDataDefinedPropertyMap(
QgsVectorLayer *layer, QDomElement *parentElem )
672 if ( !layer && !parentElem )
677 QgsPropertiesDefinition::const_iterator i = sPropertyDefinitions()->constBegin();
678 for ( ; i != sPropertyDefinitions()->constEnd(); ++i )
683 readOldDataDefinedProperty( layer,
static_cast< Property >( i.key() ) );
685 else if ( parentElem )
688 QDomElement e = parentElem->firstChildElement( i.value().name() );
691 bool active = e.attribute( QStringLiteral(
"active" ) ).compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0;
692 bool isExpression = e.attribute( QStringLiteral(
"useExpr" ) ).compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0;
706 void QgsPalLayerSettings::readFromLayerCustomProperties(
QgsVectorLayer *layer )
708 if ( layer->
customProperty( QStringLiteral(
"labeling" ) ).toString() != QLatin1String(
"pal" ) )
733 QDomDocument doc( QStringLiteral(
"substitutions" ) );
734 doc.setContent( layer->
customProperty( QStringLiteral(
"labeling/substitutions" ) ).toString() );
735 QDomElement replacementElem = doc.firstChildElement( QStringLiteral(
"substitutions" ) );
756 mLineSettings.
setPlacementFlags(
static_cast< QgsLabeling::LinePlacementFlags
>( layer->
customProperty( QStringLiteral(
"labeling/placementFlags" ) ).toUInt() ) );
765 if ( layer->
customProperty( QStringLiteral(
"labeling/distMapUnitScale" ) ).toString().isEmpty() )
768 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/distMapUnitMinScale" ), 0.0 ).toDouble();
770 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/distMapUnitMaxScale" ), 0.0 ).toDouble();
781 if ( layer->
customProperty( QStringLiteral(
"labeling/labelOffsetInMapUnits" ), QVariant(
true ) ).toBool() )
786 if ( layer->
customProperty( QStringLiteral(
"labeling/labelOffsetMapUnitScale" ) ).toString().isEmpty() )
789 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/labelOffsetMapUnitMinScale" ), 0.0 ).toDouble();
791 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/labelOffsetMapUnitMaxScale" ), 0.0 ).toDouble();
799 QVariant tempAngle = layer->
customProperty( QStringLiteral(
"labeling/angleOffset" ), QVariant() );
800 if ( tempAngle.isValid() )
802 double oldAngle = layer->
customProperty( QStringLiteral(
"labeling/angleOffset" ), QVariant( 0.0 ) ).toDouble();
816 switch ( layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceUnit" ), QVariant( 1 ) ).toUInt() )
831 if ( layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceMapUnitScale" ) ).toString().isEmpty() )
834 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceMapUnitMinScale" ), 0.0 ).toDouble();
836 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/repeatDistanceMapUnitMaxScale" ), 0.0 ).toDouble();
845 double scalemn = layer->
customProperty( QStringLiteral(
"labeling/scaleMin" ), QVariant( 0 ) ).toDouble();
846 double scalemx = layer->
customProperty( QStringLiteral(
"labeling/scaleMax" ), QVariant( 0 ) ).toDouble();
849 QVariant scalevis = layer->
customProperty( QStringLiteral(
"labeling/scaleVisibility" ), QVariant() );
850 if ( scalevis.isValid() )
856 else if ( scalemn > 0 || scalemx > 0 )
881 mObstacleSettings.
setFactor( layer->
customProperty( QStringLiteral(
"labeling/obstacleFactor" ), QVariant( 1.0 ) ).toDouble() );
883 zIndex = layer->
customProperty( QStringLiteral(
"labeling/zIndex" ), QVariant( 0.0 ) ).toDouble();
885 mDataDefinedProperties.
clear();
886 if ( layer->
customProperty( QStringLiteral(
"labeling/ddProperties" ) ).isValid() )
888 QDomDocument doc( QStringLiteral(
"dd" ) );
889 doc.setContent( layer->
customProperty( QStringLiteral(
"labeling/ddProperties" ) ).toString() );
890 QDomElement elem = doc.firstChildElement( QStringLiteral(
"properties" ) );
891 mDataDefinedProperties.
readXml( elem, *sPropertyDefinitions() );
896 readOldDataDefinedPropertyMap( layer,
nullptr );
940 QDomElement textStyleElem = elem.firstChildElement( QStringLiteral(
"text-style" ) );
941 fieldName = textStyleElem.attribute( QStringLiteral(
"fieldName" ) );
942 isExpression = textStyleElem.attribute( QStringLiteral(
"isExpression" ) ).toInt();
944 mFormat.
readXml( elem, context );
946 previewBkgrdColor = QColor( textStyleElem.attribute( QStringLiteral(
"previewBkgrdColor" ), QStringLiteral(
"#ffffff" ) ) );
949 useSubstitutions = textStyleElem.attribute( QStringLiteral(
"useSubstitutions" ) ).toInt();
950 mLegendString = textStyleElem.attribute( QStringLiteral(
"legendString" ), QObject::tr(
"Aa" ) );
953 QDomElement textFormatElem = elem.firstChildElement( QStringLiteral(
"text-format" ) );
954 wrapChar = textFormatElem.attribute( QStringLiteral(
"wrapChar" ) );
955 autoWrapLength = textFormatElem.attribute( QStringLiteral(
"autoWrapLength" ), QStringLiteral(
"0" ) ).toInt();
956 useMaxLineLengthForAutoWrap = textFormatElem.attribute( QStringLiteral(
"useMaxLineLengthForAutoWrap" ), QStringLiteral(
"1" ) ).toInt();
958 mLineSettings.
setAddDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"addDirectionSymbol" ) ).toInt() );
959 mLineSettings.
setLeftDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"leftDirectionSymbol" ), QStringLiteral(
"<" ) ) );
960 mLineSettings.
setRightDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"rightDirectionSymbol" ), QStringLiteral(
">" ) ) );
961 mLineSettings.
setReverseDirectionSymbol( textFormatElem.attribute( QStringLiteral(
"reverseDirectionSymbol" ) ).toInt() );
963 formatNumbers = textFormatElem.attribute( QStringLiteral(
"formatNumbers" ) ).toInt();
964 decimals = textFormatElem.attribute( QStringLiteral(
"decimals" ) ).toInt();
965 plusSign = textFormatElem.attribute( QStringLiteral(
"plussign" ) ).toInt();
968 QDomElement placementElem = elem.firstChildElement( QStringLiteral(
"placement" ) );
969 placement =
static_cast< Placement >( placementElem.attribute( QStringLiteral(
"placement" ) ).toInt() );
970 mLineSettings.
setPlacementFlags(
static_cast< QgsLabeling::LinePlacementFlags
>( placementElem.attribute( QStringLiteral(
"placementFlags" ) ).toUInt() ) );
971 mPolygonPlacementFlags =
static_cast< QgsLabeling::PolygonPlacementFlags
>( placementElem.attribute( QStringLiteral(
"polygonPlacementFlags" ), QString::number(
static_cast< int >( QgsLabeling::PolygonPlacementFlag::AllowPlacementInsideOfPolygon ) ) ).toInt() );
973 centroidWhole = placementElem.attribute( QStringLiteral(
"centroidWhole" ), QStringLiteral(
"0" ) ).toInt();
974 centroidInside = placementElem.attribute( QStringLiteral(
"centroidInside" ), QStringLiteral(
"0" ) ).toInt();
978 fitInPolygonOnly = placementElem.attribute( QStringLiteral(
"fitInPolygonOnly" ), QStringLiteral(
"0" ) ).toInt();
979 dist = placementElem.attribute( QStringLiteral(
"dist" ) ).toDouble();
980 if ( !placementElem.hasAttribute( QStringLiteral(
"distUnits" ) ) )
982 if ( placementElem.attribute( QStringLiteral(
"distInMapUnits" ) ).toInt() )
991 if ( !placementElem.hasAttribute( QStringLiteral(
"distMapUnitScale" ) ) )
994 double oldMin = placementElem.attribute( QStringLiteral(
"distMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
996 double oldMax = placementElem.attribute( QStringLiteral(
"distMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
1005 xOffset = placementElem.attribute( QStringLiteral(
"xOffset" ), QStringLiteral(
"0" ) ).toDouble();
1006 yOffset = placementElem.attribute( QStringLiteral(
"yOffset" ), QStringLiteral(
"0" ) ).toDouble();
1007 if ( !placementElem.hasAttribute( QStringLiteral(
"offsetUnits" ) ) )
1015 if ( !placementElem.hasAttribute( QStringLiteral(
"labelOffsetMapUnitScale" ) ) )
1018 double oldMin = placementElem.attribute( QStringLiteral(
"labelOffsetMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
1020 double oldMax = placementElem.attribute( QStringLiteral(
"labelOffsetMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
1028 if ( placementElem.hasAttribute( QStringLiteral(
"angleOffset" ) ) )
1030 double oldAngle = placementElem.attribute( QStringLiteral(
"angleOffset" ), QStringLiteral(
"0" ) ).toDouble();
1035 angleOffset = placementElem.attribute( QStringLiteral(
"rotationAngle" ), QStringLiteral(
"0" ) ).toDouble();
1038 preserveRotation = placementElem.attribute( QStringLiteral(
"preserveRotation" ), QStringLiteral(
"1" ) ).toInt();
1040 maxCurvedCharAngleIn = placementElem.attribute( QStringLiteral(
"maxCurvedCharAngleIn" ), QStringLiteral(
"25" ) ).toDouble();
1041 maxCurvedCharAngleOut = placementElem.attribute( QStringLiteral(
"maxCurvedCharAngleOut" ), QStringLiteral(
"-25" ) ).toDouble();
1042 priority = placementElem.attribute( QStringLiteral(
"priority" ) ).toInt();
1043 repeatDistance = placementElem.attribute( QStringLiteral(
"repeatDistance" ), QStringLiteral(
"0" ) ).toDouble();
1044 if ( !placementElem.hasAttribute( QStringLiteral(
"repeatDistanceUnits" ) ) )
1047 switch ( placementElem.attribute( QStringLiteral(
"repeatDistanceUnit" ), QString::number( 1 ) ).toUInt() )
1067 if ( !placementElem.hasAttribute( QStringLiteral(
"repeatDistanceMapUnitScale" ) ) )
1070 double oldMin = placementElem.attribute( QStringLiteral(
"repeatDistanceMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
1072 double oldMax = placementElem.attribute( QStringLiteral(
"repeatDistanceMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
1080 mLineSettings.
setOverrunDistance( placementElem.attribute( QStringLiteral(
"overrunDistance" ), QStringLiteral(
"0" ) ).toDouble() );
1083 mLineSettings.
setLineAnchorPercent( placementElem.attribute( QStringLiteral(
"lineAnchorPercent" ), QStringLiteral(
"0.5" ) ).toDouble() );
1087 geometryGenerator = placementElem.attribute( QStringLiteral(
"geometryGenerator" ) );
1094 QDomElement renderingElem = elem.firstChildElement( QStringLiteral(
"rendering" ) );
1096 drawLabels = renderingElem.attribute( QStringLiteral(
"drawLabels" ), QStringLiteral(
"1" ) ).toInt();
1098 maximumScale = renderingElem.attribute( QStringLiteral(
"scaleMin" ), QStringLiteral(
"0" ) ).toDouble();
1099 minimumScale = renderingElem.attribute( QStringLiteral(
"scaleMax" ), QStringLiteral(
"0" ) ).toDouble();
1100 scaleVisibility = renderingElem.attribute( QStringLiteral(
"scaleVisibility" ) ).toInt();
1102 fontLimitPixelSize = renderingElem.attribute( QStringLiteral(
"fontLimitPixelSize" ), QStringLiteral(
"0" ) ).toInt();
1103 fontMinPixelSize = renderingElem.attribute( QStringLiteral(
"fontMinPixelSize" ), QStringLiteral(
"0" ) ).toInt();
1104 fontMaxPixelSize = renderingElem.attribute( QStringLiteral(
"fontMaxPixelSize" ), QStringLiteral(
"10000" ) ).toInt();
1105 displayAll = renderingElem.attribute( QStringLiteral(
"displayAll" ), QStringLiteral(
"0" ) ).toInt();
1108 labelPerPart = renderingElem.attribute( QStringLiteral(
"labelPerPart" ) ).toInt();
1109 mLineSettings.
setMergeLines( renderingElem.attribute( QStringLiteral(
"mergeLines" ) ).toInt() );
1110 mThinningSettings.
setMinimumFeatureSize( renderingElem.attribute( QStringLiteral(
"minFeatureSize" ) ).toDouble() );
1111 mThinningSettings.
setLimitNumberLabelsEnabled( renderingElem.attribute( QStringLiteral(
"limitNumLabels" ), QStringLiteral(
"0" ) ).toInt() );
1112 mThinningSettings.
setMaximumNumberLabels( renderingElem.attribute( QStringLiteral(
"maxNumLabels" ), QStringLiteral(
"2000" ) ).toInt() );
1113 mObstacleSettings.
setIsObstacle( renderingElem.attribute( QStringLiteral(
"obstacle" ), QStringLiteral(
"1" ) ).toInt() );
1114 mObstacleSettings.
setFactor( renderingElem.attribute( QStringLiteral(
"obstacleFactor" ), QStringLiteral(
"1" ) ).toDouble() );
1116 zIndex = renderingElem.attribute( QStringLiteral(
"zIndex" ), QStringLiteral(
"0.0" ) ).toDouble();
1119 QDomElement ddElem = elem.firstChildElement( QStringLiteral(
"dd_properties" ) );
1120 if ( !ddElem.isNull() )
1122 mDataDefinedProperties.
readXml( ddElem, *sPropertyDefinitions() );
1127 mDataDefinedProperties.
clear();
1128 QDomElement ddElem = elem.firstChildElement( QStringLiteral(
"data-defined" ) );
1129 readOldDataDefinedPropertyMap(
nullptr, &ddElem );
1170 const QString calloutType = elem.attribute( QStringLiteral(
"calloutType" ) );
1171 if ( calloutType.isEmpty() )
1183 QDomElement textStyleElem = mFormat.
writeXml( doc, context );
1186 textStyleElem.setAttribute( QStringLiteral(
"fieldName" ),
fieldName );
1187 textStyleElem.setAttribute( QStringLiteral(
"isExpression" ),
isExpression );
1188 QDomElement replacementElem = doc.createElement( QStringLiteral(
"substitutions" ) );
1190 textStyleElem.appendChild( replacementElem );
1191 textStyleElem.setAttribute( QStringLiteral(
"useSubstitutions" ),
useSubstitutions );
1192 textStyleElem.setAttribute( QStringLiteral(
"legendString" ), mLegendString );
1195 QDomElement textFormatElem = doc.createElement( QStringLiteral(
"text-format" ) );
1196 textFormatElem.setAttribute( QStringLiteral(
"wrapChar" ),
wrapChar );
1197 textFormatElem.setAttribute( QStringLiteral(
"autoWrapLength" ),
autoWrapLength );
1199 textFormatElem.setAttribute( QStringLiteral(
"multilineAlign" ),
static_cast< unsigned int >(
multilineAlign ) );
1200 textFormatElem.setAttribute( QStringLiteral(
"addDirectionSymbol" ), mLineSettings.
addDirectionSymbol() );
1201 textFormatElem.setAttribute( QStringLiteral(
"leftDirectionSymbol" ), mLineSettings.
leftDirectionSymbol() );
1202 textFormatElem.setAttribute( QStringLiteral(
"rightDirectionSymbol" ), mLineSettings.
rightDirectionSymbol() );
1203 textFormatElem.setAttribute( QStringLiteral(
"reverseDirectionSymbol" ), mLineSettings.
reverseDirectionSymbol() );
1204 textFormatElem.setAttribute( QStringLiteral(
"placeDirectionSymbol" ),
static_cast< unsigned int >( mLineSettings.
directionSymbolPlacement() ) );
1205 textFormatElem.setAttribute( QStringLiteral(
"formatNumbers" ),
formatNumbers );
1206 textFormatElem.setAttribute( QStringLiteral(
"decimals" ),
decimals );
1207 textFormatElem.setAttribute( QStringLiteral(
"plussign" ),
plusSign );
1210 QDomElement placementElem = doc.createElement( QStringLiteral(
"placement" ) );
1211 placementElem.setAttribute( QStringLiteral(
"placement" ),
placement );
1212 placementElem.setAttribute( QStringLiteral(
"polygonPlacementFlags" ),
static_cast< int >( mPolygonPlacementFlags ) );
1213 placementElem.setAttribute( QStringLiteral(
"placementFlags" ),
static_cast< unsigned int >( mLineSettings.
placementFlags() ) );
1214 placementElem.setAttribute( QStringLiteral(
"centroidWhole" ),
centroidWhole );
1215 placementElem.setAttribute( QStringLiteral(
"centroidInside" ),
centroidInside );
1217 placementElem.setAttribute( QStringLiteral(
"fitInPolygonOnly" ),
fitInPolygonOnly );
1218 placementElem.setAttribute( QStringLiteral(
"dist" ),
dist );
1221 placementElem.setAttribute( QStringLiteral(
"offsetType" ),
static_cast< unsigned int >(
offsetType ) );
1222 placementElem.setAttribute( QStringLiteral(
"quadOffset" ),
static_cast< unsigned int >(
quadOffset ) );
1223 placementElem.setAttribute( QStringLiteral(
"xOffset" ),
xOffset );
1224 placementElem.setAttribute( QStringLiteral(
"yOffset" ),
yOffset );
1227 placementElem.setAttribute( QStringLiteral(
"rotationAngle" ),
angleOffset );
1228 placementElem.setAttribute( QStringLiteral(
"preserveRotation" ),
preserveRotation );
1229 placementElem.setAttribute( QStringLiteral(
"rotationUnit" ),
qgsEnumValueToKey( mRotationUnit ) );
1232 placementElem.setAttribute( QStringLiteral(
"priority" ),
priority );
1233 placementElem.setAttribute( QStringLiteral(
"repeatDistance" ),
repeatDistance );
1236 placementElem.setAttribute( QStringLiteral(
"overrunDistance" ), mLineSettings.
overrunDistance() );
1239 placementElem.setAttribute( QStringLiteral(
"lineAnchorPercent" ), mLineSettings.
lineAnchorPercent() );
1240 placementElem.setAttribute( QStringLiteral(
"lineAnchorType" ),
static_cast< int >( mLineSettings.
anchorType() ) );
1241 placementElem.setAttribute( QStringLiteral(
"lineAnchorClipping" ),
static_cast< int >( mLineSettings.
anchorClipping() ) );
1243 placementElem.setAttribute( QStringLiteral(
"geometryGenerator" ),
geometryGenerator );
1245 const QMetaEnum metaEnum( QMetaEnum::fromType<QgsWkbTypes::GeometryType>() );
1246 placementElem.setAttribute( QStringLiteral(
"geometryGeneratorType" ), metaEnum.valueToKey(
geometryGeneratorType ) );
1248 placementElem.setAttribute( QStringLiteral(
"layerType" ), metaEnum.valueToKey(
layerType ) );
1251 QDomElement renderingElem = doc.createElement( QStringLiteral(
"rendering" ) );
1252 renderingElem.setAttribute( QStringLiteral(
"drawLabels" ),
drawLabels );
1253 renderingElem.setAttribute( QStringLiteral(
"scaleVisibility" ),
scaleVisibility );
1254 renderingElem.setAttribute( QStringLiteral(
"scaleMin" ),
maximumScale );
1255 renderingElem.setAttribute( QStringLiteral(
"scaleMax" ),
minimumScale );
1256 renderingElem.setAttribute( QStringLiteral(
"fontLimitPixelSize" ),
fontLimitPixelSize );
1257 renderingElem.setAttribute( QStringLiteral(
"fontMinPixelSize" ),
fontMinPixelSize );
1258 renderingElem.setAttribute( QStringLiteral(
"fontMaxPixelSize" ),
fontMaxPixelSize );
1259 renderingElem.setAttribute( QStringLiteral(
"displayAll" ),
displayAll );
1260 renderingElem.setAttribute( QStringLiteral(
"upsidedownLabels" ),
static_cast< unsigned int >(
upsidedownLabels ) );
1262 renderingElem.setAttribute( QStringLiteral(
"labelPerPart" ),
labelPerPart );
1263 renderingElem.setAttribute( QStringLiteral(
"mergeLines" ), mLineSettings.
mergeLines() );
1264 renderingElem.setAttribute( QStringLiteral(
"minFeatureSize" ), mThinningSettings.
minimumFeatureSize() );
1266 renderingElem.setAttribute( QStringLiteral(
"maxNumLabels" ), mThinningSettings.
maximumNumberLabels() );
1267 renderingElem.setAttribute( QStringLiteral(
"obstacle" ), mObstacleSettings.
isObstacle() );
1268 renderingElem.setAttribute( QStringLiteral(
"obstacleFactor" ), mObstacleSettings.
factor() );
1269 renderingElem.setAttribute( QStringLiteral(
"obstacleType" ),
static_cast< unsigned int >( mObstacleSettings.
type() ) );
1270 renderingElem.setAttribute( QStringLiteral(
"zIndex" ),
zIndex );
1271 renderingElem.setAttribute( QStringLiteral(
"unplacedVisibility" ),
static_cast< int >( mUnplacedVisibility ) );
1273 QDomElement ddElem = doc.createElement( QStringLiteral(
"dd_properties" ) );
1274 mDataDefinedProperties.
writeXml( ddElem, *sPropertyDefinitions() );
1276 QDomElement elem = doc.createElement( QStringLiteral(
"settings" ) );
1277 elem.appendChild( textStyleElem );
1278 elem.appendChild( textFormatElem );
1279 elem.appendChild( placementElem );
1280 elem.appendChild( renderingElem );
1281 elem.appendChild( ddElem );
1285 elem.setAttribute( QStringLiteral(
"calloutType" ), mCallout->type() );
1286 mCallout->saveProperties( doc, elem, context );
1301 QPixmap pixmap( size );
1302 pixmap.fill( Qt::transparent );
1304 painter.begin( &pixmap );
1306 painter.setRenderHint( QPainter::Antialiasing );
1308 QRect rect( 0, 0, size.width(), size.height() );
1311 painter.setPen( Qt::NoPen );
1313 if ( ( background1.lightnessF() < 0.7 ) )
1315 background1 = background1.darker( 125 );
1319 background1 = background1.lighter( 125 );
1322 QLinearGradient linearGrad( QPointF( 0, 0 ), QPointF( 0, rect.height() ) );
1323 linearGrad.setColorAt( 0, background1 );
1324 linearGrad.setColorAt( 1, background2 );
1325 painter.setBrush( QBrush( linearGrad ) );
1326 if ( size.width() > 30 )
1328 painter.drawRoundedRect( rect, 6, 6 );
1333 painter.drawRect( rect );
1335 painter.setBrush( Qt::NoBrush );
1336 painter.setPen( Qt::NoPen );
1345 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
1346 const double logicalDpiX = QgsApplication::desktop()->logicalDpiX();
1348 QWidget *activeWindow = QApplication::activeWindow();
1349 const double logicalDpiX = activeWindow && activeWindow->screen() ? activeWindow->screen()->logicalDotsPerInchX() : 96.0;
1363 double ytrans = 0.0;
1369 const QStringList text = QStringList() << ( previewText.isEmpty() ? settings.
legendString() : previewText );
1371 QRectF textRect = rect;
1372 textRect.setLeft( xtrans + padding );
1373 textRect.setWidth( rect.width() - xtrans - 2 * padding );
1375 if ( textRect.width() > 2000 )
1376 textRect.setWidth( 2000 - 2 * padding );
1378 const double bottom = textRect.height() / 2 + textHeight / 2;
1379 textRect.setTop( bottom - textHeight );
1380 textRect.setBottom( bottom );
1391 QRectF labelRect( textRect.left() + ( textRect.width() - textWidth ) / 2.0, textRect.top(), textWidth, textRect.height() );
1398 if ( size.width() > 30 )
1403 rect.width() - iconWidth * 3, rect.height() - iconWidth * 3,
1404 iconWidth * 2, iconWidth * 2 ), Qt::AlignRight | Qt::AlignBottom );
1408 painter.setBrush( Qt::NoBrush );
1410 if ( size.width() > 30 )
1412 painter.drawRoundedRect( rect, 6, 6 );
1417 painter.drawRect( rect );
1426 return mUnplacedVisibility;
1431 mUnplacedVisibility = visibility;
1436 return QgsPalLabeling::checkMinimumSizeMM(
ct, geom, minSize );
1446 QString textCopy( text );
1449 std::unique_ptr< QgsRenderContext > scopedRc;
1454 scopedRc->expressionContext().setFeature( *f );
1570 if ( wrapchr.isEmpty() )
1572 wrapchr = QStringLiteral(
"\n" );
1577 && ( !leftDirSymb.isEmpty() || !rightDirSymb.isEmpty() ) )
1579 QString dirSym = leftDirSymb;
1581 if ( fm->horizontalAdvance( rightDirSymb ) > fm->horizontalAdvance( dirSym ) )
1582 dirSym = rightDirSymb;
1584 switch ( placeDirSymb )
1587 textCopy.append( dirSym );
1592 textCopy.prepend( dirSym + QStringLiteral(
"\n" ) );
1597 double w = 0.0, h = 0.0, rw = 0.0, rh = 0.0;
1598 double labelHeight = fm->ascent() + fm->descent();
1600 QStringList multiLineSplit;
1612 int lines = multiLineSplit.size();
1614 switch ( orientation )
1618 h += fm->height() +
static_cast< double >( ( lines - 1 ) * labelHeight * multilineH );
1620 for (
const auto &line : multiLineSplit )
1622 w = std::max( w, fm->horizontalAdvance( line ) );
1629 double letterSpacing = mFormat.
scaledFont( *context ).letterSpacing();
1630 double labelWidth = fm->maxWidth();
1631 w = labelWidth + ( lines - 1 ) * labelWidth * multilineH;
1633 int maxLineLength = 0;
1634 for (
const auto &line : multiLineSplit )
1636 maxLineLength = std::max( maxLineLength,
static_cast<int>( line.length() ) );
1638 h = fm->ascent() * maxLineLength + ( maxLineLength - 1 ) * letterSpacing;
1644 double widthHorizontal = 0.0;
1645 for (
const auto &line : multiLineSplit )
1647 widthHorizontal = std::max( w, fm->horizontalAdvance( line ) );
1650 double widthVertical = 0.0;
1651 double letterSpacing = mFormat.
scaledFont( *context ).letterSpacing();
1652 double labelWidth = fm->maxWidth();
1653 widthVertical = labelWidth + ( lines - 1 ) * labelWidth * multilineH;
1655 double heightHorizontal = 0.0;
1656 heightHorizontal += fm->height() +
static_cast< double >( ( lines - 1 ) * labelHeight * multilineH );
1658 double heightVertical = 0.0;
1659 int maxLineLength = 0;
1660 for (
const auto &line : multiLineSplit )
1662 maxLineLength = std::max( maxLineLength,
static_cast<int>( line.length() ) );
1664 heightVertical = fm->ascent() * maxLineLength + ( maxLineLength - 1 ) * letterSpacing;
1666 w = widthHorizontal;
1667 rw = heightVertical;
1668 h = heightHorizontal;
1676 labelX = std::fabs( ptSize.
x() -
ptZero.
x() );
1677 labelY = std::fabs( ptSize.
y() -
ptZero.
y() );
1682 if ( rotatedLabelX && rotatedLabelY )
1684 *rotatedLabelX = rw * uPP;
1685 *rotatedLabelY = rh * uPP;
1701 bool isObstacle = mObstacleSettings.
isObstacle();
1709 return registerObstacleFeature( f, context, obstacleGeometry );
1724 if ( obstacleGeometry.
isNull() )
1737 dataDefinedValues.clear();
1754 if ( useScaleVisibility )
1767 maxScale = 1 / std::fabs( maxScale );
1786 minScale = 1 / std::fabs( minScale );
1795 QFont labelFont = mFormat.
font();
1801 if ( !exprVal.isNull() )
1803 QString units = exprVal.toString();
1804 if ( !units.isEmpty() )
1814 double fontSize = mFormat.
size();
1820 if ( fontSize <= 0.0 )
1827 if ( fontPixelSize < 1 )
1831 labelFont.setPixelSize( fontPixelSize );
1843 if ( fontMinPixel > labelFont.pixelSize() || labelFont.pixelSize() > fontMaxPixel )
1855 labelFont.setCapitalization( QFont::MixedCase );
1857 parseTextStyle( labelFont, fontunits, context );
1860 parseTextFormatting( context );
1861 parseTextBuffer( context );
1862 parseTextMask( context );
1863 parseShapeBackground( context );
1864 parseDropShadow( context );
1885 labelText = result.isNull() ? QString() : result.toString();
1890 labelText = v.isNull() ? QString() : v.toString();
1910 if ( !exprVal.isNull() )
1912 QString fcase = exprVal.toString().trimmed();
1913 QgsDebugMsgLevel( QStringLiteral(
"exprVal FontCase:%1" ).arg( fcase ), 4 );
1915 if ( !fcase.isEmpty() )
1917 if ( fcase.compare( QLatin1String(
"NoChange" ), Qt::CaseInsensitive ) == 0 )
1921 else if ( fcase.compare( QLatin1String(
"Upper" ), Qt::CaseInsensitive ) == 0 )
1925 else if ( fcase.compare( QLatin1String(
"Lower" ), Qt::CaseInsensitive ) == 0 )
1929 else if ( fcase.compare( QLatin1String(
"Capitalize" ), Qt::CaseInsensitive ) == 0 )
1933 else if ( fcase.compare( QLatin1String(
"Title" ), Qt::CaseInsensitive ) == 0 )
1948 if ( evalFormatNumbers )
1952 if ( decimalPlaces <= 0 )
1958 QVariant textV( labelText );
1960 double d = textV.toDouble( &ok );
1963 QString numberFormat;
1964 if ( d > 0 && signPlus )
1966 numberFormat.append(
'+' );
1968 numberFormat.append(
"%1" );
1969 labelText = numberFormat.arg( d, 0,
'f', decimalPlaces );
1974 std::unique_ptr<QFontMetricsF> labelFontMetrics(
new QFontMetricsF( labelFont ) );
1975 double labelX, labelY, rotatedLabelX, rotatedLabelY;
1978 if (
format().allowHtmlFormatting() )
1982 calculateLabelSize( labelFontMetrics.get(), labelText, labelX, labelY,
mCurFeat, &context, &rotatedLabelX, &rotatedLabelY,
format().allowHtmlFormatting() ? &doc :
nullptr );
1986 double maxcharanglein = 20.0;
1987 double maxcharangleout = -20.0;
2002 maxcharanglein = std::clamp(
static_cast< double >( maxcharanglePt.x() ), 20.0, 60.0 );
2003 maxcharangleout = std::clamp(
static_cast< double >( maxcharanglePt.y() ), 20.0, 95.0 );
2007 maxcharangleout = -( std::fabs( maxcharangleout ) );
2015 if ( !exprVal.isNull() )
2017 QString
str = exprVal.toString().trimmed();
2020 if ( !
str.isEmpty() )
2022 if (
str.compare( QLatin1String(
"Visible" ), Qt::CaseInsensitive ) == 0 )
2024 wholeCentroid =
false;
2026 else if (
str.compare( QLatin1String(
"Whole" ), Qt::CaseInsensitive ) == 0 )
2028 wholeCentroid =
true;
2042 std::unique_ptr<QgsGeometry> scopedClonedGeom;
2048 geom = simplifier.
simplify( geom );
2065 bool doClip =
false;
2066 if ( !centroidPoly || !wholeCentroid )
2072 QgsLabeling::PolygonPlacementFlags polygonPlacement = mPolygonPlacementFlags;
2076 if ( !dataDefinedOutside.isNull() )
2078 if ( dataDefinedOutside.type() == QVariant::String )
2080 const QString value = dataDefinedOutside.toString().trimmed();
2081 if ( value.compare( QLatin1String(
"force" ), Qt::CaseInsensitive ) == 0 )
2084 polygonPlacement &= ~static_cast< int >( QgsLabeling::PolygonPlacementFlag::AllowPlacementInsideOfPolygon );
2085 polygonPlacement |= QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon;
2087 else if ( value.compare( QLatin1String(
"yes" ), Qt::CaseInsensitive ) == 0 )
2090 polygonPlacement |= QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon;
2092 else if ( value.compare( QLatin1String(
"no" ), Qt::CaseInsensitive ) == 0 )
2095 polygonPlacement &= ~static_cast< int >( QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon );
2100 if ( dataDefinedOutside.toBool() )
2103 polygonPlacement |= QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon;
2108 polygonPlacement &= ~static_cast< int >( QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon );
2136 permissibleZone = geom;
2172 double minimumSize = 0.0;
2182 if ( !checkMinimumSizeMM( context, geom, featureThinningSettings.
minimumFeatureSize() ) )
2187 if ( !geos_geom_clone )
2216 bool hasDataDefinedPosition =
false;
2217 bool layerDefinedRotation =
false;
2218 bool dataDefinedRotation =
false;
2219 double xPos = 0.0, yPos = 0.0,
angle = 0.0;
2220 bool ddXPos =
false, ddYPos =
false;
2221 double quadOffsetX = 0.0, quadOffsetY = 0.0;
2222 double offsetX = 0.0, offsetY = 0.0;
2234 bool ddFixedQuad =
false;
2240 if ( !exprVal.isNull() )
2243 int quadInt = exprVal.toInt( &ok );
2244 if ( ok && 0 <= quadInt && quadInt <= 8 )
2312 if ( !exprVal.isNull() )
2314 QString units = exprVal.toString().trimmed();
2315 if ( !units.isEmpty() )
2321 offUnit = decodedUnits;
2336 layerDefinedRotation =
true;
2346 if ( !exprVal.isNull() )
2349 const double rotation = exprVal.toDouble( &ok );
2352 dataDefinedRotation =
true;
2360 angle = ( 360 - rotationDegrees ) * M_PI / 180.0;
2368 if ( !exprVal.isNull() )
2370 if ( !exprVal.isNull() )
2371 xPos = exprVal.toDouble( &ddXPos );
2376 if ( !exprVal.isNull() )
2379 if ( !exprVal.isNull() )
2380 yPos = exprVal.toDouble( &ddYPos );
2382 if ( ddXPos && ddYPos )
2384 hasDataDefinedPosition =
true;
2386 if ( layerDefinedRotation && !dataDefinedRotation )
2395 if ( !exprVal.isNull() )
2397 QString haliString = exprVal.toString();
2398 if ( haliString.compare( QLatin1String(
"Center" ), Qt::CaseInsensitive ) == 0 )
2400 xdiff -= labelX / 2.0;
2402 else if ( haliString.compare( QLatin1String(
"Right" ), Qt::CaseInsensitive ) == 0 )
2413 if ( !exprVal.isNull() )
2415 QString valiString = exprVal.toString();
2416 if ( valiString.compare( QLatin1String(
"Bottom" ), Qt::CaseInsensitive ) != 0 )
2418 if ( valiString.compare( QLatin1String(
"Top" ), Qt::CaseInsensitive ) == 0 )
2424 double descentRatio = labelFontMetrics->descent() / labelFontMetrics->height();
2425 if ( valiString.compare( QLatin1String(
"Base" ), Qt::CaseInsensitive ) == 0 )
2427 ydiff -= labelY * descentRatio;
2431 double capHeightRatio = ( labelFontMetrics->boundingRect(
'H' ).height() + 1 + labelFontMetrics->descent() ) / labelFontMetrics->height();
2432 ydiff -= labelY * capHeightRatio;
2433 if ( valiString.compare( QLatin1String(
"Half" ), Qt::CaseInsensitive ) == 0 )
2435 ydiff += labelY * ( capHeightRatio - descentRatio ) / 2.0;
2443 if ( dataDefinedRotation )
2446 double xd = xdiff * std::cos(
angle ) - ydiff * std::sin(
angle );
2447 double yd = xdiff * std::sin(
angle ) + ydiff * std::cos(
angle );
2457 if (
const QgsPoint *point = qgsgeometry_cast< const QgsPoint * >( ddPoint.
constGet() ) )
2465 QgsMessageLog::logMessage( QObject::tr(
"Invalid data defined label position (%1, %2)" ).arg( xPos ).arg( yPos ), QObject::tr(
"Labeling" ) );
2466 hasDataDefinedPosition =
false;
2483 bool alwaysShow =
false;
2503 if ( !exprVal.isNull() )
2505 QString units = exprVal.toString().trimmed();
2506 if ( !units.isEmpty() )
2512 repeatUnits = decodedUnits;
2538 bool labelAll =
labelPerPart && !hasDataDefinedPosition;
2539 if ( !hasDataDefinedPosition )
2549 std::unique_ptr< QgsTextLabelFeature > labelFeature = std::make_unique< QgsTextLabelFeature>( feature.
id(), std::move( geos_geom_clone ), QSizeF( labelX, labelY ) );
2550 labelFeature->setAnchorPosition( anchorPosition );
2551 labelFeature->setFeature( feature );
2552 labelFeature->setSymbol( symbol );
2553 labelFeature->setDocument( doc );
2555 labelFeature->setRotatedSize( QSizeF( rotatedLabelX, rotatedLabelY ) );
2558 labelFeature->setHasFixedPosition( hasDataDefinedPosition );
2559 labelFeature->setFixedPosition(
QgsPointXY( xPos, yPos ) );
2561 labelFeature->setHasFixedAngle( dataDefinedRotation || ( !hasDataDefinedPosition && !
qgsDoubleNear(
angle, 0.0 ) ) );
2562 labelFeature->setFixedAngle(
angle );
2563 labelFeature->setQuadOffset( QPointF( quadOffsetX, quadOffsetY ) );
2564 labelFeature->setPositionOffset(
QgsPointXY( offsetX, offsetY ) );
2566 labelFeature->setAlwaysShow( alwaysShow );
2567 labelFeature->setRepeatDistance( repeatDist );
2568 labelFeature->setLabelText( labelText );
2569 labelFeature->setPermissibleZone( permissibleZone );
2570 labelFeature->setOverrunDistance( overrunDistanceEval );
2571 labelFeature->setOverrunSmoothDistance( overrunSmoothDist );
2574 labelFeature->setLabelAllParts( labelAll );
2576 labelFeature->setMinimumSize( minimumSize );
2580 labelFeature->setSymbolSize( QSizeF( obstacleGeometry.
boundingBox().
width(),
2586 double topMargin = std::max( 0.25 * labelFontMetrics->ascent(), 0.0 );
2587 double bottomMargin = 1.0 + labelFontMetrics->descent();
2588 QgsMargins vm( 0.0, topMargin, 0.0, bottomMargin );
2590 labelFeature->setVisualMargin( vm );
2593 QgsDebugMsgLevel( QStringLiteral(
"PAL font stored definedFont: %1, Style: %2" ).arg( labelFont.toString(), labelFont.styleName() ), 4 );
2594 labelFeature->setDefinedFont( labelFont );
2595 labelFeature->setFontMetrics( *labelFontMetrics );
2597 labelFeature->setMaximumCharacterAngleInside( std::clamp( maxcharanglein, 20.0, 60.0 ) * M_PI / 180 );
2598 labelFeature->setMaximumCharacterAngleOutside( std::clamp( maxcharangleout, -95.0, -20.0 ) * M_PI / 180 );
2622 double distance =
dist;
2634 if ( !exprVal.isNull() )
2636 QString units = exprVal.toString().trimmed();
2637 QgsDebugMsgLevel( QStringLiteral(
"exprVal DistanceUnits:%1" ).arg( units ), 4 );
2638 if ( !units.isEmpty() )
2644 distUnit = decodedUnits;
2657 distance = ( distance < 0 ? -1 : 1 ) * std::max( std::fabs( distance ), 1.0 );
2665 distance = std::max( distance, 2.0 );
2671 labelFeature->setDistLabel( d );
2676 labelFeature->setHasFixedQuadrant(
true );
2681 labelFeature->setPolygonPlacementFlags( polygonPlacement );
2690 labelFeature->setZIndex( z );
2697 if ( !exprVal.isNull() )
2700 double priorityD = exprVal.toDouble( &ok );
2703 priorityD = std::clamp( priorityD, 0.0, 10.0 );
2704 priorityD = 1 - priorityD / 10.0;
2705 labelFeature->setPriority( priorityD );
2714 labelFeature->setObstacleSettings( os );
2717 if ( positionOrder.isEmpty() )
2718 positionOrder = *DEFAULT_PLACEMENT_ORDER();
2724 if ( !dataDefinedOrder.isEmpty() )
2729 labelFeature->setPredefinedPositionOrder( positionOrder );
2732 labelFeature->setDataDefinedValues( dataDefinedValues );
2734 return labelFeature;
2742 if ( !obstacleGeometry.
isNull() )
2744 geom = obstacleGeometry;
2759 if ( ls->numPoints() < 2 )
2765 std::unique_ptr<QgsGeometry> scopedClonedGeom;
2771 geom = simplifier.
simplify( geom );
2775 std::unique_ptr<QgsGeometry> scopedPreparedGeom;
2783 if ( !geos_geom_clone )
2787 std::unique_ptr< QgsLabelFeature > obstacleFeature = std::make_unique< QgsLabelFeature >( f.
id(), std::move( geos_geom_clone ), QSizeF( 0, 0 ) );
2788 obstacleFeature->setFeature( f );
2793 obstacleFeature->setObstacleSettings( os );
2796 return obstacleFeature;
2799 bool QgsPalLayerSettings::dataDefinedValEval( DataDefinedValueType valType,
2803 if ( !mDataDefinedProperties.
isActive( p ) )
2807 exprVal = mDataDefinedProperties.
value( p, context );
2808 if ( !exprVal.isNull() )
2814 bool bol = exprVal.toBool();
2815 dataDefinedValues.insert( p, QVariant( bol ) );
2821 int size = exprVal.toInt( &ok );
2825 dataDefinedValues.insert( p, QVariant( size ) );
2833 int size = exprVal.toInt( &ok );
2835 if ( ok && size > 0 )
2837 dataDefinedValues.insert( p, QVariant( size ) );
2845 double size = exprVal.toDouble( &ok );
2849 dataDefinedValues.insert( p, QVariant( size ) );
2857 double size = exprVal.toDouble( &ok );
2859 if ( ok && size > 0.0 )
2861 dataDefinedValues.insert( p, QVariant( size ) );
2869 double rot = exprVal.toDouble( &ok );
2872 if ( rot < -180.0 && rot >= -360 )
2876 if ( rot > 180.0 && rot <= 360 )
2880 if ( rot >= -180 && rot <= 180 )
2882 dataDefinedValues.insert( p, QVariant( rot ) );
2891 int size = exprVal.toInt( &ok );
2892 if ( ok && size >= 0 && size <= 100 )
2894 dataDefinedValues.insert( p, QVariant( size ) );
2901 QString
str = exprVal.toString();
2903 dataDefinedValues.insert( p, QVariant(
str ) );
2908 QString unitstr = exprVal.toString().trimmed();
2910 if ( !unitstr.isEmpty() )
2919 QString colorstr = exprVal.toString().trimmed();
2922 if ( color.isValid() )
2924 dataDefinedValues.insert( p, QVariant( color ) );
2931 QString joinstr = exprVal.toString().trimmed();
2933 if ( !joinstr.isEmpty() )
2942 QString blendstr = exprVal.toString().trimmed();
2944 if ( !blendstr.isEmpty() )
2957 dataDefinedValues.insert( p, res );
2968 dataDefinedValues.insert( p, res );
2978 void QgsPalLayerSettings::parseTextStyle( QFont &labelFont,
2991 QString ddFontFamily;
2996 if ( !exprVal.isNull() )
2998 QString family = exprVal.toString().trimmed();
2999 QgsDebugMsgLevel( QStringLiteral(
"exprVal Font family:%1" ).arg( family ), 4 );
3001 if ( labelFont.family() != family )
3007 ddFontFamily = family;
3014 QString ddFontStyle;
3018 if ( !exprVal.isNull() )
3020 QString fontstyle = exprVal.toString().trimmed();
3021 QgsDebugMsgLevel( QStringLiteral(
"exprVal Font style:%1" ).arg( fontstyle ), 4 );
3022 ddFontStyle = fontstyle;
3027 bool ddBold =
false;
3035 bool ddItalic =
false;
3045 QFont appFont = QApplication::font();
3046 bool newFontBuilt =
false;
3047 if ( ddBold || ddItalic )
3050 newFont = QFont( !ddFontFamily.isEmpty() ? ddFontFamily : labelFont.family() );
3051 newFontBuilt =
true;
3052 newFont.setBold( ddBold );
3053 newFont.setItalic( ddItalic );
3055 else if ( !ddFontStyle.isEmpty()
3056 && ddFontStyle.compare( QLatin1String(
"Ignore" ), Qt::CaseInsensitive ) != 0 )
3058 if ( !ddFontFamily.isEmpty() )
3062 mFontDB = std::make_unique< QFontDatabase >();
3064 QFont styledfont = mFontDB->font( ddFontFamily, ddFontStyle, appFont.pointSize() );
3065 if ( appFont != styledfont )
3067 newFont = styledfont;
3068 newFontBuilt =
true;
3075 else if ( !ddFontFamily.isEmpty() )
3077 if ( ddFontStyle.compare( QLatin1String(
"Ignore" ), Qt::CaseInsensitive ) != 0 )
3081 mFontDB = std::make_unique< QFontDatabase >();
3082 QFont styledfont = mFontDB->font( ddFontFamily, mFormat.
namedStyle(), appFont.pointSize() );
3083 if ( appFont != styledfont )
3085 newFont = styledfont;
3086 newFontBuilt =
true;
3091 newFont = QFont( ddFontFamily );
3092 newFontBuilt =
true;
3100 newFont.setPixelSize( labelFont.pixelSize() );
3101 newFont.setUnderline( labelFont.underline() );
3102 newFont.setStrikeOut( labelFont.strikeOut() );
3103 newFont.setWordSpacing( labelFont.wordSpacing() );
3104 newFont.setLetterSpacing( QFont::AbsoluteSpacing, labelFont.letterSpacing() );
3106 labelFont = newFont;
3110 double wordspace = labelFont.wordSpacing();
3119 double letterspace = labelFont.letterSpacing();
3132 labelFont.setStrikeOut( strikeout );
3140 labelFont.setUnderline( underline );
3166 drawBuffer = exprVal.toBool();
3179 double bufrSize = buffer.
size();
3182 bufrSize = exprVal.toDouble();
3186 double bufferOpacity = buffer.
opacity() * 100;
3189 bufferOpacity = exprVal.toDouble();
3192 drawBuffer = ( drawBuffer && bufrSize > 0.0 && bufferOpacity > 0 );
3222 bool maskEnabled = mask.
enabled();
3225 maskEnabled = exprVal.toBool();
3234 double bufrSize = mask.
size();
3237 bufrSize = exprVal.toDouble();
3241 double opacity = mask.
opacity() * 100;
3244 opacity = exprVal.toDouble();
3247 maskEnabled = ( maskEnabled && bufrSize > 0.0 && opacity > 0 );
3272 wrapchr = exprVal.toString();
3278 evalAutoWrapLength = exprVal.toInt();
3289 if ( !exprVal.isNull() )
3291 QString
str = exprVal.toString().trimmed();
3294 if ( !
str.isEmpty() )
3299 if (
str.compare( QLatin1String(
"Center" ), Qt::CaseInsensitive ) == 0 )
3303 else if (
str.compare( QLatin1String(
"Right" ), Qt::CaseInsensitive ) == 0 )
3307 else if (
str.compare( QLatin1String(
"Follow" ), Qt::CaseInsensitive ) == 0 )
3311 else if (
str.compare( QLatin1String(
"Justify" ), Qt::CaseInsensitive ) == 0 )
3326 if ( !exprVal.isNull() )
3328 QString
str = exprVal.toString().trimmed();
3329 if ( !
str.isEmpty() )
3338 drawDirSymb = exprVal.toBool();
3351 if ( !exprVal.isNull() )
3353 QString
str = exprVal.toString().trimmed();
3356 if ( !
str.isEmpty() )
3361 if (
str.compare( QLatin1String(
"Above" ), Qt::CaseInsensitive ) == 0 )
3365 else if (
str.compare( QLatin1String(
"Below" ), Qt::CaseInsensitive ) == 0 )
3380 void QgsPalLayerSettings::parseShapeBackground(
QgsRenderContext &context )
3387 bool drawShape = background.
enabled();
3390 drawShape = exprVal.toBool();
3399 double shapeOpacity = background.
opacity() * 100;
3402 shapeOpacity = 100.0 * exprVal.toDouble();
3405 drawShape = ( drawShape && shapeOpacity > 0 );
3419 if ( !exprVal.isNull() )
3421 QString skind = exprVal.toString().trimmed();
3422 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeKind:%1" ).arg( skind ), 4 );
3424 if ( !skind.isEmpty() )
3433 QString svgPath = background.
svgFile();
3438 if ( !exprVal.isNull() )
3440 QString svgfile = exprVal.toString().trimmed();
3441 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeSVGFile:%1" ).arg( svgfile ), 4 );
3454 if ( !exprVal.isNull() )
3456 QString stype = exprVal.toString().trimmed();
3457 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeSizeType:%1" ).arg( stype ), 4 );
3459 if ( !stype.isEmpty() )
3468 double ddShpSizeX = background.
size().width();
3471 ddShpSizeX = exprVal.toDouble();
3475 double ddShpSizeY = background.
size().height();
3478 ddShpSizeY = exprVal.toDouble();
3484 && ( svgPath.isEmpty()
3485 || ( !svgPath.isEmpty()
3487 && ddShpSizeX == 0.0 ) ) )
3495 && ddShpSizeX == 0.0 ) ) )
3502 && ( ddShpSizeX == 0.0 || ddShpSizeY == 0.0 ) )
3525 if ( !exprVal.isNull() )
3527 QString rotstr = exprVal.toString().trimmed();
3528 QgsDebugMsgLevel( QStringLiteral(
"exprVal ShapeRotationType:%1" ).arg( rotstr ), 4 );
3530 if ( !rotstr.isEmpty() )
3581 bool drawShadow = shadow.
enabled();
3584 drawShadow = exprVal.toBool();
3593 double shadowOpacity = shadow.
opacity() * 100;
3596 shadowOpacity = exprVal.toDouble();
3603 shadowOffDist = exprVal.toDouble();
3610 shadowRad = exprVal.toDouble();
3613 drawShadow = ( drawShadow && shadowOpacity > 0 && !( shadowOffDist == 0.0 && shadowRad == 0.0 ) );
3628 if ( !exprVal.isNull() )
3630 QString
str = exprVal.toString().trimmed();
3633 if ( !
str.isEmpty() )
3668 switch ( layer->
type() )
3672 const QgsVectorLayer *vl = qobject_cast< const QgsVectorLayer * >( layer );
3683 return !labeling->styles().empty();
3731 QStringList
QgsPalLabeling::splitToLines(
const QString &text,
const QString &wrapCharacter,
const int autoWrapLength,
const bool useMaxLineLengthWhenAutoWrapping )
3733 QStringList multiLineSplit;
3734 if ( !wrapCharacter.isEmpty() && wrapCharacter != QLatin1String(
"\n" ) )
3737 const QStringList lines = text.split( wrapCharacter );
3738 for (
const QString &line : lines )
3740 multiLineSplit.append( line.split(
'\n' ) );
3745 multiLineSplit = text.split(
'\n' );
3749 if ( autoWrapLength != 0 )
3751 QStringList autoWrappedLines;
3752 autoWrappedLines.reserve( multiLineSplit.count() );
3753 for (
const QString &line : std::as_const( multiLineSplit ) )
3755 autoWrappedLines.append(
QgsStringUtils::wordWrap( line, autoWrapLength, useMaxLineLengthWhenAutoWrapping ).split(
'\n' ) );
3757 multiLineSplit = autoWrappedLines;
3759 return multiLineSplit;
3764 QStringList graphemes;
3765 QTextBoundaryFinder boundaryFinder( QTextBoundaryFinder::Grapheme, text );
3766 int currentBoundary = -1;
3767 int previousBoundary = 0;
3768 while ( ( currentBoundary = boundaryFinder.toNextBoundary() ) > 0 )
3770 graphemes << text.mid( previousBoundary, currentBoundary - previousBoundary );
3771 previousBoundary = currentBoundary;
3801 QgsDebugMsgLevel( QStringLiteral(
"Ignoring feature due to transformation exception" ), 4 );
3807 return std::isfinite( point.
x() ) && std::isfinite( point.
y() );
3811 cp->removeInvalidRings();
3813 else if (
QgsMultiSurface *ms = qgsgeometry_cast< QgsMultiSurface * >( geom.
get() ) )
3815 for (
int i = 0; i < ms->numGeometries(); ++i )
3817 if (
QgsCurvePolygon *cp = qgsgeometry_cast< QgsCurvePolygon * >( ms->geometryN( i ) ) )
3818 cp->removeInvalidRings();
3830 QgsDebugMsg( QStringLiteral(
"Error rotating geometry" ).arg( geom.
asWkt() ) );
3835 #if GEOS_VERSION_MAJOR>3 || ( GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR>=9 )
3837 const bool mustClip = ( !clipGeometry.
isNull() &&
3841 bool mustClipExact =
false;
3865 QVector< QgsGeometry> parts;
3866 parts.reserve( qgsgeometry_cast< const QgsGeometryCollection * >( geom.
constGet() )->numGeometries() );
3875 parts.append( partGeom );
3883 if ( bufferGeom.
isNull() )
3885 QgsDebugMsg( QStringLiteral(
"Could not repair geometry: %1" ).arg( bufferGeom.
lastError() ) );
3892 if ( mustClipExact )
3912 QVector< QgsGeometry> parts;
3913 parts.reserve( qgsgeometry_cast< const QgsGeometryCollection * >( geom.
constGet() )->numGeometries() );
3919 partGeom = partGeom.
buffer( 0, 0 );
3921 parts.append( partGeom );
3928 if ( bufferGeom.
isNull() )
3930 QgsDebugMsg( QStringLiteral(
"Could not repair geometry: %1" ).arg( bufferGeom.
lastError() ) );
3937 if ( !clipGeometry.
isNull() &&
3974 double length = geom.
length();
3975 if ( length >= 0.0 )
3977 return ( length >= ( minSize * mapUnitsPerMM ) );
3982 double area = geom.
area();
3985 return ( std::sqrt( area ) >= ( minSize * mapUnitsPerMM ) );
3993 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
3996 bool changed =
false;
4002 format.
setColor( ddColor.value<QColor>() );
4027 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4089 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4092 bool changed =
false;
4140 buffer.
setColor( ddColor.value<QColor>() );
4167 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4169 if ( ddValues.isEmpty() )
4173 bool changed =
false;
4233 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4236 bool changed =
false;
4276 QSizeF size = background.
size();
4283 QSizeF size = background.
size();
4384 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues )
4387 bool changed =
false;
4446 shadow.
setColor( ddColor.value<QColor>() );
4486 double cx = lp->
getX() + w / 2.0;
4487 double cy = lp->
getY() + h / 2.0;
4490 double sw = w * scale;
4491 double sh = h * scale;
4492 QRectF rect( -sw / 2, -sh / 2, sw, sh );
4494 painter->translate( xform->
transform( QPointF( cx, cy ) ).toQPointF() );
4498 if ( lp->
getFeaturePart()->getLayer()->getArrangement() != P_POINT &&
4499 lp->
getFeaturePart()->getLayer()->getArrangement() != P_POINT_OVER &&
4502 painter->rotate( rotation );
4505 painter->translate( rect.bottomLeft() );
4506 painter->rotate( -lp->
getAlpha() * 180 / M_PI );
4507 painter->translate( -rect.bottomLeft() );
4510 QRectF rect( 0, 0, outPt2.
x() - outPt.
x(), outPt2.
y() - outPt.
y() );
4511 painter->translate( QPointF( outPt.
x(), outPt.
y() ) );
4512 painter->rotate( -lp->
getAlpha() * 180 / M_PI );
4517 painter->setPen( QColor( 255, 0, 0, 64 ) );
4521 painter->setPen( QColor( 0, 0, 0, 64 ) );
4523 painter->drawRect( rect );
4527 rect.moveTo( outPt.
x(), outPt.
y() );
@ Success
Operation succeeded.
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.
Extends QApplication to provide access to QGIS specific resources such as theme paths,...
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.
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).
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.
@ MaxScale
Max scale (deprecated, for old project compatibility only)
@ Hali
Horizontal alignment for data defined label position (Left, Center, Right)
@ 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.
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.
@ 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.
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, Capitalization capitalization)
Converts a string by applying capitalization rules to the string.
Capitalization
Capitalization options.
@ 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...
@ AllUppercase
Convert all characters to uppercase.
@ ForceFirstLetterToCapital
Convert just the first letter of each word to uppercase, leave the rest untouched.
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.
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.
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.
QgsStringUtils::Capitalization capitalization() const
Returns the text capitalization style.
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.
@ AlignCenter
Center align.
static double textHeight(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, DrawMode mode=Point, QFontMetricsF *fontMetrics=nullptr)
Returns the height of a text based on a given format.
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 void drawText(const QRectF &rect, double rotation, HAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, VAlignment vAlignment=AlignTop)
Draws text within a rectangle using the specified settings.
@ 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
Added in 3.18.
@ VectorTileLayer
Added in 3.14.
@ AnnotationLayer
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
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