Make placement options in marker and hash line symbol layers checkboxes instead of mutually exclusive buttons

Makes it considerably quicker to create a marker line with the
markers on the first AND last vertex, amongst other things...

Fixes #18433

Sponsored by North Road, thanks to SLYR
This commit is contained in:
Nyall Dawson 2021-11-12 05:44:08 +11:00 committed by GitHub
parent 1d01ad1322
commit aaafd786df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 343 additions and 299 deletions

View File

@ -1040,6 +1040,8 @@ QgsTemplatedLineSymbolLayerBase.SegmentCenter.__doc__ = "Place symbols at the ce
Qgis.MarkerLinePlacement.__doc__ = 'Defines how/where the symbols should be placed on a line.\n\n.. note::\n\n Prior to QGIS 3.24 this was available as :py:class:`QgsTemplatedLineSymbolLayerBase`.Placement\n\n.. versionadded:: 3.24\n\n' + '* ``Interval``: ' + Qgis.MarkerLinePlacement.Interval.__doc__ + '\n' + '* ``Vertex``: ' + Qgis.MarkerLinePlacement.Vertex.__doc__ + '\n' + '* ``LastVertex``: ' + Qgis.MarkerLinePlacement.LastVertex.__doc__ + '\n' + '* ``FirstVertex``: ' + Qgis.MarkerLinePlacement.FirstVertex.__doc__ + '\n' + '* ``CentralPoint``: ' + Qgis.MarkerLinePlacement.CentralPoint.__doc__ + '\n' + '* ``CurvePoint``: ' + Qgis.MarkerLinePlacement.CurvePoint.__doc__ + '\n' + '* ``SegmentCenter``: ' + Qgis.MarkerLinePlacement.SegmentCenter.__doc__
# --
Qgis.MarkerLinePlacement.baseClass = Qgis
Qgis.MarkerLinePlacements.baseClass = Qgis
MarkerLinePlacements = Qgis # dirty hack since SIP seems to introduce the flags in module
QgsGradientFillSymbolLayer.GradientColorType = Qgis.GradientColorSource
# monkey patching scoped based enum
QgsGradientFillSymbolLayer.SimpleTwoColor = Qgis.GradientColorSource.SimpleTwoColor

View File

@ -668,6 +668,8 @@ The development version
CurvePoint,
SegmentCenter,
};
typedef QFlags<Qgis::MarkerLinePlacement> MarkerLinePlacements;
enum class GradientColorSource
{
@ -852,6 +854,8 @@ QFlags<Qgis::RenderContextFlag> operator|(Qgis::RenderContextFlag f1, QFlags<Qgi
QFlags<Qgis::VectorLayerTypeFlag> operator|(Qgis::VectorLayerTypeFlag f1, QFlags<Qgis::VectorLayerTypeFlag> f2);
QFlags<Qgis::MarkerLinePlacement> operator|(Qgis::MarkerLinePlacement f1, QFlags<Qgis::MarkerLinePlacement> f2);

View File

@ -676,18 +676,42 @@ Returns the map unit scale for the interval between symbols.
.. seealso:: :py:func:`interval`
%End
Qgis::MarkerLinePlacement placement() const;
Qgis::MarkerLinePlacement placement() const /Deprecated/;
%Docstring
Returns the placement of the symbols.
.. seealso:: :py:func:`setPlacement`
.. deprecated::
use :py:func:`~QgsTemplatedLineSymbolLayerBase.placements` instead
%End
void setPlacement( Qgis::MarkerLinePlacement placement );
void setPlacement( Qgis::MarkerLinePlacement placement ) /Deprecated/;
%Docstring
Sets the ``placement`` of the symbols.
.. seealso:: :py:func:`placement`
.. deprecated::
use :py:func:`~QgsTemplatedLineSymbolLayerBase.setPlacements` instead
%End
Qgis::MarkerLinePlacements placements() const;
%Docstring
Returns the placement of the symbols.
.. seealso:: :py:func:`setPlacements`
.. versionadded:: 3.24
%End
void setPlacements( Qgis::MarkerLinePlacements placements );
%Docstring
Sets the ``placement`` of the symbols.
.. seealso:: :py:func:`placements`
.. versionadded:: 3.24
%End
double offsetAlongLine() const;

View File

@ -1058,15 +1058,17 @@ class CORE_EXPORT Qgis
*/
enum class MarkerLinePlacement SIP_MONKEYPATCH_SCOPEENUM_UNNEST( QgsTemplatedLineSymbolLayerBase, Placement ) : int
{
Interval, //!< Place symbols at regular intervals
Vertex, //!< Place symbols on every vertex in the line
LastVertex, //!< Place symbols on the last vertex in the line
FirstVertex, //!< Place symbols on the first vertex in the line
CentralPoint, //!< Place symbols at the mid point of the line
CurvePoint, //!< Place symbols at every virtual curve point in the line (used when rendering curved geometry types only)
SegmentCenter, //!< Place symbols at the center of every line segment
Interval = 1 << 0, //!< Place symbols at regular intervals
Vertex = 1 << 1, //!< Place symbols on every vertex in the line
LastVertex = 1 << 2, //!< Place symbols on the last vertex in the line
FirstVertex = 1 << 3, //!< Place symbols on the first vertex in the line
CentralPoint = 1 << 4, //!< Place symbols at the mid point of the line
CurvePoint = 1 << 5, //!< Place symbols at every virtual curve point in the line (used when rendering curved geometry types only)
SegmentCenter = 1 << 6, //!< Place symbols at the center of every line segment
};
Q_ENUM( MarkerLinePlacement )
Q_DECLARE_FLAGS( MarkerLinePlacements, MarkerLinePlacement )
Q_FLAG( MarkerLinePlacements )
/**
* Gradient color sources.
@ -1362,6 +1364,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::AnnotationItemGuiFlags )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::MapSettingsFlags )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::RenderContextFlags )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::VectorLayerTypeFlags )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::MarkerLinePlacements )
// hack to workaround warnings when casting void pointers

View File

@ -1231,6 +1231,31 @@ QgsTemplatedLineSymbolLayerBase::QgsTemplatedLineSymbolLayerBase( bool rotateSym
}
Qgis::MarkerLinePlacement QgsTemplatedLineSymbolLayerBase::placement() const
{
if ( mPlacements & Qgis::MarkerLinePlacement::Interval )
return Qgis::MarkerLinePlacement::Interval;
else if ( mPlacements & Qgis::MarkerLinePlacement::Vertex )
return Qgis::MarkerLinePlacement::Vertex;
else if ( mPlacements & Qgis::MarkerLinePlacement::LastVertex )
return Qgis::MarkerLinePlacement::LastVertex;
else if ( mPlacements & Qgis::MarkerLinePlacement::FirstVertex )
return Qgis::MarkerLinePlacement::FirstVertex;
else if ( mPlacements & Qgis::MarkerLinePlacement::CentralPoint )
return Qgis::MarkerLinePlacement::CentralPoint;
else if ( mPlacements & Qgis::MarkerLinePlacement::CurvePoint )
return Qgis::MarkerLinePlacement::CurvePoint;
else if ( mPlacements & Qgis::MarkerLinePlacement::SegmentCenter )
return Qgis::MarkerLinePlacement::SegmentCenter;
else
return Qgis::MarkerLinePlacement::Interval;
}
void QgsTemplatedLineSymbolLayerBase::setPlacement( Qgis::MarkerLinePlacement placement )
{
mPlacements = placement;
}
QgsTemplatedLineSymbolLayerBase::~QgsTemplatedLineSymbolLayerBase() = default;
void QgsTemplatedLineSymbolLayerBase::renderPolyline( const QPolygonF &points, QgsSymbolRenderContext &context )
@ -1243,7 +1268,7 @@ void QgsTemplatedLineSymbolLayerBase::renderPolyline( const QPolygonF &points, Q
offset = mDataDefinedProperties.valueAsDouble( QgsSymbolLayer::PropertyOffset, context.renderContext().expressionContext(), mOffset );
}
Qgis::MarkerLinePlacement placement = QgsTemplatedLineSymbolLayerBase::placement();
Qgis::MarkerLinePlacements placements = QgsTemplatedLineSymbolLayerBase::placements();
if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyPlacement ) )
{
@ -1253,35 +1278,35 @@ void QgsTemplatedLineSymbolLayerBase::renderPolyline( const QPolygonF &points, Q
QString placementString = exprVal.toString();
if ( placementString.compare( QLatin1String( "interval" ), Qt::CaseInsensitive ) == 0 )
{
placement = Qgis::MarkerLinePlacement::Interval;
placements = Qgis::MarkerLinePlacement::Interval;
}
else if ( placementString.compare( QLatin1String( "vertex" ), Qt::CaseInsensitive ) == 0 )
{
placement = Qgis::MarkerLinePlacement::Vertex;
placements = Qgis::MarkerLinePlacement::Vertex;
}
else if ( placementString.compare( QLatin1String( "lastvertex" ), Qt::CaseInsensitive ) == 0 )
{
placement = Qgis::MarkerLinePlacement::LastVertex;
placements = Qgis::MarkerLinePlacement::LastVertex;
}
else if ( placementString.compare( QLatin1String( "firstvertex" ), Qt::CaseInsensitive ) == 0 )
{
placement = Qgis::MarkerLinePlacement::FirstVertex;
placements = Qgis::MarkerLinePlacement::FirstVertex;
}
else if ( placementString.compare( QLatin1String( "centerpoint" ), Qt::CaseInsensitive ) == 0 )
{
placement = Qgis::MarkerLinePlacement::CentralPoint;
placements = Qgis::MarkerLinePlacement::CentralPoint;
}
else if ( placementString.compare( QLatin1String( "curvepoint" ), Qt::CaseInsensitive ) == 0 )
{
placement = Qgis::MarkerLinePlacement::CurvePoint;
placements = Qgis::MarkerLinePlacement::CurvePoint;
}
else if ( placementString.compare( QLatin1String( "segmentcenter" ), Qt::CaseInsensitive ) == 0 )
{
placement = Qgis::MarkerLinePlacement::SegmentCenter;
placements = Qgis::MarkerLinePlacement::SegmentCenter;
}
else
{
placement = Qgis::MarkerLinePlacement::Interval;
placements = Qgis::MarkerLinePlacement::Interval;
}
}
}
@ -1298,24 +1323,20 @@ void QgsTemplatedLineSymbolLayerBase::renderPolyline( const QPolygonF &points, Q
if ( qgsDoubleNear( offset, 0.0 ) )
{
switch ( placement )
{
case Qgis::MarkerLinePlacement::Interval:
renderPolylineInterval( points, context, averageOver );
break;
case Qgis::MarkerLinePlacement::CentralPoint:
renderPolylineCentral( points, context, averageOver );
break;
case Qgis::MarkerLinePlacement::Vertex:
case Qgis::MarkerLinePlacement::LastVertex:
case Qgis::MarkerLinePlacement::FirstVertex:
case Qgis::MarkerLinePlacement::CurvePoint:
case Qgis::MarkerLinePlacement::SegmentCenter:
renderPolylineVertex( points, context, placement );
break;
}
if ( placements & Qgis::MarkerLinePlacement::Interval )
renderPolylineInterval( points, context, averageOver );
if ( placements & Qgis::MarkerLinePlacement::CentralPoint )
renderPolylineCentral( points, context, averageOver );
if ( placements & Qgis::MarkerLinePlacement::Vertex )
renderPolylineVertex( points, context, Qgis::MarkerLinePlacement::Vertex );
if ( placements & Qgis::MarkerLinePlacement::LastVertex )
renderPolylineVertex( points, context, Qgis::MarkerLinePlacement::LastVertex );
if ( placements & Qgis::MarkerLinePlacement::FirstVertex )
renderPolylineVertex( points, context, Qgis::MarkerLinePlacement::FirstVertex );
if ( placements & Qgis::MarkerLinePlacement::CurvePoint )
renderPolylineVertex( points, context, Qgis::MarkerLinePlacement::CurvePoint );
if ( placements & Qgis::MarkerLinePlacement::SegmentCenter )
renderPolylineVertex( points, context, Qgis::MarkerLinePlacement::SegmentCenter );
}
else
{
@ -1326,24 +1347,20 @@ void QgsTemplatedLineSymbolLayerBase::renderPolyline( const QPolygonF &points, Q
{
const QPolygonF &points2 = mline[ part ];
switch ( placement )
{
case Qgis::MarkerLinePlacement::Interval:
renderPolylineInterval( points2, context, averageOver );
break;
case Qgis::MarkerLinePlacement::CentralPoint:
renderPolylineCentral( points2, context, averageOver );
break;
case Qgis::MarkerLinePlacement::Vertex:
case Qgis::MarkerLinePlacement::LastVertex:
case Qgis::MarkerLinePlacement::FirstVertex:
case Qgis::MarkerLinePlacement::CurvePoint:
case Qgis::MarkerLinePlacement::SegmentCenter:
renderPolylineVertex( points2, context, placement );
break;
}
if ( placements & Qgis::MarkerLinePlacement::Interval )
renderPolylineInterval( points2, context, averageOver );
if ( placements & Qgis::MarkerLinePlacement::CentralPoint )
renderPolylineCentral( points2, context, averageOver );
if ( placements & Qgis::MarkerLinePlacement::Vertex )
renderPolylineVertex( points2, context, Qgis::MarkerLinePlacement::Vertex );
if ( placements & Qgis::MarkerLinePlacement::LastVertex )
renderPolylineVertex( points2, context, Qgis::MarkerLinePlacement::LastVertex );
if ( placements & Qgis::MarkerLinePlacement::FirstVertex )
renderPolylineVertex( points2, context, Qgis::MarkerLinePlacement::FirstVertex );
if ( placements & Qgis::MarkerLinePlacement::CurvePoint )
renderPolylineVertex( points2, context, Qgis::MarkerLinePlacement::CurvePoint );
if ( placements & Qgis::MarkerLinePlacement::SegmentCenter )
renderPolylineVertex( points2, context, Qgis::MarkerLinePlacement::SegmentCenter );
}
}
}
@ -1454,30 +1471,7 @@ QVariantMap QgsTemplatedLineSymbolLayerBase::properties() const
map[QStringLiteral( "average_angle_unit" )] = QgsUnitTypes::encodeUnit( mAverageAngleLengthUnit );
map[QStringLiteral( "average_angle_map_unit_scale" )] = QgsSymbolLayerUtils::encodeMapUnitScale( mAverageAngleLengthMapUnitScale );
switch ( mPlacement )
{
case Qgis::MarkerLinePlacement::Vertex:
map[QStringLiteral( "placement" )] = QStringLiteral( "vertex" );
break;
case Qgis::MarkerLinePlacement::LastVertex:
map[QStringLiteral( "placement" )] = QStringLiteral( "lastvertex" );
break;
case Qgis::MarkerLinePlacement::FirstVertex:
map[QStringLiteral( "placement" )] = QStringLiteral( "firstvertex" );
break;
case Qgis::MarkerLinePlacement::CentralPoint:
map[QStringLiteral( "placement" )] = QStringLiteral( "centralpoint" );
break;
case Qgis::MarkerLinePlacement::CurvePoint:
map[QStringLiteral( "placement" )] = QStringLiteral( "curvepoint" );
break;
case Qgis::MarkerLinePlacement::Interval:
map[QStringLiteral( "placement" )] = QStringLiteral( "interval" );
break;
case Qgis::MarkerLinePlacement::SegmentCenter:
map[QStringLiteral( "placement" )] = QStringLiteral( "segmentcenter" );
break;
}
map[QStringLiteral( "placements" )] = qgsFlagValueToKeys( mPlacements );
map[QStringLiteral( "ring_filter" )] = QString::number( static_cast< int >( mRingFilter ) );
return map;
@ -1485,27 +1479,16 @@ QVariantMap QgsTemplatedLineSymbolLayerBase::properties() const
bool QgsTemplatedLineSymbolLayerBase::canCauseArtifactsBetweenAdjacentTiles() const
{
switch ( mPlacement )
{
case Qgis::MarkerLinePlacement::Interval:
case Qgis::MarkerLinePlacement::CentralPoint:
case Qgis::MarkerLinePlacement::SegmentCenter:
return true;
case Qgis::MarkerLinePlacement::Vertex:
case Qgis::MarkerLinePlacement::CurvePoint:
case Qgis::MarkerLinePlacement::LastVertex:
case Qgis::MarkerLinePlacement::FirstVertex:
return false;
}
return false;
return ( mPlacements & Qgis::MarkerLinePlacement::Interval )
|| ( mPlacements & Qgis::MarkerLinePlacement::CentralPoint )
|| ( mPlacements & Qgis::MarkerLinePlacement::SegmentCenter );
}
void QgsTemplatedLineSymbolLayerBase::copyTemplateSymbolProperties( QgsTemplatedLineSymbolLayerBase *destLayer ) const
{
destLayer->setSubSymbol( const_cast< QgsTemplatedLineSymbolLayerBase * >( this )->subSymbol()->clone() );
destLayer->setOffset( mOffset );
destLayer->setPlacement( placement() );
destLayer->setPlacements( placements() );
destLayer->setOffsetUnit( mOffsetUnit );
destLayer->setOffsetMapUnitScale( mOffsetMapUnitScale );
destLayer->setIntervalUnit( intervalUnit() );
@ -1573,19 +1556,24 @@ void QgsTemplatedLineSymbolLayerBase::setCommonProperties( QgsTemplatedLineSymbo
if ( properties.contains( QStringLiteral( "placement" ) ) )
{
if ( properties[QStringLiteral( "placement" )] == QLatin1String( "vertex" ) )
destLayer->setPlacement( Qgis::MarkerLinePlacement::Vertex );
destLayer->setPlacements( Qgis::MarkerLinePlacement::Vertex );
else if ( properties[QStringLiteral( "placement" )] == QLatin1String( "lastvertex" ) )
destLayer->setPlacement( Qgis::MarkerLinePlacement::LastVertex );
destLayer->setPlacements( Qgis::MarkerLinePlacement::LastVertex );
else if ( properties[QStringLiteral( "placement" )] == QLatin1String( "firstvertex" ) )
destLayer->setPlacement( Qgis::MarkerLinePlacement::FirstVertex );
destLayer->setPlacements( Qgis::MarkerLinePlacement::FirstVertex );
else if ( properties[QStringLiteral( "placement" )] == QLatin1String( "centralpoint" ) )
destLayer->setPlacement( Qgis::MarkerLinePlacement::CentralPoint );
destLayer->setPlacements( Qgis::MarkerLinePlacement::CentralPoint );
else if ( properties[QStringLiteral( "placement" )] == QLatin1String( "curvepoint" ) )
destLayer->setPlacement( Qgis::MarkerLinePlacement::CurvePoint );
destLayer->setPlacements( Qgis::MarkerLinePlacement::CurvePoint );
else if ( properties[QStringLiteral( "placement" )] == QLatin1String( "segmentcenter" ) )
destLayer->setPlacement( Qgis::MarkerLinePlacement::SegmentCenter );
destLayer->setPlacements( Qgis::MarkerLinePlacement::SegmentCenter );
else
destLayer->setPlacement( Qgis::MarkerLinePlacement::Interval );
destLayer->setPlacements( Qgis::MarkerLinePlacement::Interval );
}
else
{
Qgis::MarkerLinePlacements placements = qgsFlagKeysToValue( properties.value( QStringLiteral( "placements" ) ).toString(), Qgis::MarkerLinePlacement::Interval );
destLayer->setPlacements( placements );
}
if ( properties.contains( QStringLiteral( "ring_filter" ) ) )
@ -2335,25 +2323,20 @@ void QgsMarkerLineSymbolLayer::toSld( QDomDocument &doc, QDomElement &element, c
QgsSymbolLayerUtils::createGeometryElement( doc, symbolizerElem, props.value( QStringLiteral( "geom" ), QString() ).toString() );
QString gap;
switch ( placement() )
if ( placements() & Qgis::MarkerLinePlacement::FirstVertex )
symbolizerElem.appendChild( QgsSymbolLayerUtils::createVendorOptionElement( doc, QStringLiteral( "placement" ), QStringLiteral( "firstPoint" ) ) );
if ( placements() & Qgis::MarkerLinePlacement::LastVertex )
symbolizerElem.appendChild( QgsSymbolLayerUtils::createVendorOptionElement( doc, QStringLiteral( "placement" ), QStringLiteral( "lastPoint" ) ) );
if ( placements() & Qgis::MarkerLinePlacement::CentralPoint )
symbolizerElem.appendChild( QgsSymbolLayerUtils::createVendorOptionElement( doc, QStringLiteral( "placement" ), QStringLiteral( "centralPoint" ) ) );
if ( placements() & Qgis::MarkerLinePlacement::Vertex )
// no way to get line/polygon's vertices, use a VendorOption
symbolizerElem.appendChild( QgsSymbolLayerUtils::createVendorOptionElement( doc, QStringLiteral( "placement" ), QStringLiteral( "points" ) ) );
if ( placements() & Qgis::MarkerLinePlacement::Interval )
{
case Qgis::MarkerLinePlacement::FirstVertex:
symbolizerElem.appendChild( QgsSymbolLayerUtils::createVendorOptionElement( doc, QStringLiteral( "placement" ), QStringLiteral( "firstPoint" ) ) );
break;
case Qgis::MarkerLinePlacement::LastVertex:
symbolizerElem.appendChild( QgsSymbolLayerUtils::createVendorOptionElement( doc, QStringLiteral( "placement" ), QStringLiteral( "lastPoint" ) ) );
break;
case Qgis::MarkerLinePlacement::CentralPoint:
symbolizerElem.appendChild( QgsSymbolLayerUtils::createVendorOptionElement( doc, QStringLiteral( "placement" ), QStringLiteral( "centralPoint" ) ) );
break;
case Qgis::MarkerLinePlacement::Vertex:
// no way to get line/polygon's vertices, use a VendorOption
symbolizerElem.appendChild( QgsSymbolLayerUtils::createVendorOptionElement( doc, QStringLiteral( "placement" ), QStringLiteral( "points" ) ) );
break;
default:
double interval = QgsSymbolLayerUtils::rescaleUom( QgsMarkerLineSymbolLayer::interval(), intervalUnit(), props );
gap = qgsDoubleToString( interval );
break;
double interval = QgsSymbolLayerUtils::rescaleUom( QgsMarkerLineSymbolLayer::interval(), intervalUnit(), props );
gap = qgsDoubleToString( interval );
}
if ( !rotateSymbols() )
@ -2477,7 +2460,7 @@ QgsSymbolLayer *QgsMarkerLineSymbolLayer::createFromSld( QDomElement &element )
QgsMarkerLineSymbolLayer *x = new QgsMarkerLineSymbolLayer( rotateMarker );
x->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
x->setPlacement( placement );
x->setPlacements( placement );
x->setInterval( interval );
x->setSubSymbol( marker.release() );
x->setOffset( offset );

View File

@ -626,14 +626,30 @@ class CORE_EXPORT QgsTemplatedLineSymbolLayerBase : public QgsLineSymbolLayer
/**
* Returns the placement of the symbols.
* \see setPlacement()
* \deprecated use placements() instead
*/
Qgis::MarkerLinePlacement placement() const { return mPlacement; }
Q_DECL_DEPRECATED Qgis::MarkerLinePlacement placement() const SIP_DEPRECATED;
/**
* Sets the \a placement of the symbols.
* \see placement()
* \deprecated use setPlacements() instead
*/
void setPlacement( Qgis::MarkerLinePlacement placement ) { mPlacement = placement; }
Q_DECL_DEPRECATED void setPlacement( Qgis::MarkerLinePlacement placement ) SIP_DEPRECATED;
/**
* Returns the placement of the symbols.
* \see setPlacements()
* \since QGIS 3.24
*/
Qgis::MarkerLinePlacements placements() const { return mPlacements; }
/**
* Sets the \a placement of the symbols.
* \see placements()
* \since QGIS 3.24
*/
void setPlacements( Qgis::MarkerLinePlacements placements ) { mPlacements = placements; }
/**
* Returns the offset along the line for the symbol placement. For Interval placements, this is the distance
@ -834,7 +850,7 @@ class CORE_EXPORT QgsTemplatedLineSymbolLayerBase : public QgsLineSymbolLayer
double mInterval = 3;
QgsUnitTypes::RenderUnit mIntervalUnit = QgsUnitTypes::RenderMillimeters;
QgsMapUnitScale mIntervalMapUnitScale;
Qgis::MarkerLinePlacement mPlacement = Qgis::MarkerLinePlacement::Interval;
Qgis::MarkerLinePlacements mPlacements = Qgis::MarkerLinePlacement::Interval;
double mOffsetAlongLine = 0; //distance to offset along line before marker is drawn
QgsUnitTypes::RenderUnit mOffsetAlongLineUnit = QgsUnitTypes::RenderMillimeters; //unit for offset along line
QgsMapUnitScale mOffsetAlongLineMapUnitScale;

View File

@ -827,7 +827,7 @@ QgsLineSymbol *QgsMapInfoSymbolConverter::convertLineSymbol( int identifier, Qgs
}
}
marker->setPlacement( placement );
marker->setPlacements( placement );
marker->setInterval( spacing * size );
marker->setIntervalUnit( sizeUnit );
@ -869,14 +869,14 @@ QgsLineSymbol *QgsMapInfoSymbolConverter::convertLineSymbol( int identifier, Qgs
else if ( identifier == 61 )
{
std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
marker2->setPlacement( Qgis::MarkerLinePlacement::FirstVertex );
marker2->setPlacements( Qgis::MarkerLinePlacement::FirstVertex );
qgis::down_cast< QgsMarkerSymbol * >( marker2->subSymbol() )->setAngle( 180 );
symbol->appendSymbolLayer( marker2.release() );
}
else if ( identifier == 80 || identifier == 88 || identifier == 96 || identifier == 104 )
{
std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
marker2->setPlacement( Qgis::MarkerLinePlacement::LastVertex );
marker2->setPlacements( Qgis::MarkerLinePlacement::LastVertex );
qgis::down_cast< QgsMarkerSymbol * >( marker2->subSymbol() )->setAngle( 180 );
symbol->appendSymbolLayer( marker2.release() );
}
@ -951,7 +951,7 @@ QgsLineSymbol *QgsMapInfoSymbolConverter::convertLineSymbol( int identifier, Qgs
else if ( identifier == 62 )
{
std::unique_ptr< QgsMarkerLineSymbolLayer > markerLine = std::make_unique< QgsMarkerLineSymbolLayer >();
markerLine->setPlacement( Qgis::MarkerLinePlacement::FirstVertex );
markerLine->setPlacements( Qgis::MarkerLinePlacement::FirstVertex );
markerLine->setOffsetAlongLine( 2 * size );
markerLine->setOffsetAlongLineUnit( sizeUnit );

View File

@ -1783,7 +1783,7 @@ bool QgsMapBoxGlStyleConverter::parseSymbolLayerAsRenderer( const QVariantMap &j
if ( spacing < 1 )
{
// if spacing isn't specified, it's a central point marker only
lineSymbol->setPlacement( Qgis::MarkerLinePlacement::CentralPoint );
lineSymbol->setPlacements( Qgis::MarkerLinePlacement::CentralPoint );
}
QgsRasterMarkerSymbolLayer *markerLayer = new QgsRasterMarkerSymbolLayer( );

View File

@ -1927,13 +1927,13 @@ QgsMarkerLineSymbolLayerWidget::QgsMarkerLineSymbolLayerWidget( QgsVectorLayer *
connect( chkRotateMarker, &QAbstractButton::clicked, this, &QgsMarkerLineSymbolLayerWidget::setRotate );
connect( spinOffset, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsMarkerLineSymbolLayerWidget::setOffset );
connect( mSpinAverageAngleLength, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsMarkerLineSymbolLayerWidget::setAverageAngle );
connect( radInterval, &QAbstractButton::clicked, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( radVertex, &QAbstractButton::clicked, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( radVertexLast, &QAbstractButton::clicked, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( radVertexFirst, &QAbstractButton::clicked, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( radCentralPoint, &QAbstractButton::clicked, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( radCurvePoint, &QAbstractButton::clicked, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( radSegmentCentralPoint, &QAbstractButton::clicked, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( mCheckInterval, &QCheckBox::toggled, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( mCheckVertex, &QCheckBox::toggled, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( mCheckVertexLast, &QCheckBox::toggled, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( mCheckVertexFirst, &QCheckBox::toggled, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( mCheckCentralPoint, &QCheckBox::toggled, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( mCheckCurvePoint, &QCheckBox::toggled, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
connect( mCheckSegmentCentralPoint, &QCheckBox::toggled, this, &QgsMarkerLineSymbolLayerWidget::setPlacement );
}
void QgsMarkerLineSymbolLayerWidget::setSymbolLayer( QgsSymbolLayer *layer )
@ -1957,20 +1957,14 @@ void QgsMarkerLineSymbolLayerWidget::setSymbolLayer( QgsSymbolLayer *layer )
spinOffset->blockSignals( true );
spinOffset->setValue( mLayer->offset() );
spinOffset->blockSignals( false );
if ( mLayer->placement() == Qgis::MarkerLinePlacement::Interval )
radInterval->setChecked( true );
else if ( mLayer->placement() == Qgis::MarkerLinePlacement::Vertex )
radVertex->setChecked( true );
else if ( mLayer->placement() == Qgis::MarkerLinePlacement::LastVertex )
radVertexLast->setChecked( true );
else if ( mLayer->placement() == Qgis::MarkerLinePlacement::CentralPoint )
radCentralPoint->setChecked( true );
else if ( mLayer->placement() == Qgis::MarkerLinePlacement::CurvePoint )
radCurvePoint->setChecked( true );
else if ( mLayer->placement() == Qgis::MarkerLinePlacement::SegmentCenter )
radSegmentCentralPoint->setChecked( true );
else
radVertexFirst->setChecked( true );
whileBlocking( mCheckInterval )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::Interval );
whileBlocking( mCheckVertex )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::Vertex );
whileBlocking( mCheckVertexFirst )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::FirstVertex );
whileBlocking( mCheckVertexLast )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::LastVertex );
whileBlocking( mCheckCentralPoint )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::CentralPoint );
whileBlocking( mCheckCurvePoint )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::CurvePoint );
whileBlocking( mCheckSegmentCentralPoint )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::SegmentCenter );
// set units
mIntervalUnitWidget->blockSignals( true );
@ -2039,7 +2033,7 @@ void QgsMarkerLineSymbolLayerWidget::setOffsetAlongLine( double val )
void QgsMarkerLineSymbolLayerWidget::setRotate()
{
mSpinAverageAngleLength->setEnabled( chkRotateMarker->isChecked() && ( radInterval->isChecked() || radCentralPoint->isChecked() ) );
mSpinAverageAngleLength->setEnabled( chkRotateMarker->isChecked() && ( mCheckInterval->isChecked() || mCheckCentralPoint->isChecked() ) );
mAverageAngleUnit->setEnabled( mSpinAverageAngleLength->isEnabled() );
mLayer->setRotateSymbols( chkRotateMarker->isChecked() );
@ -2054,27 +2048,29 @@ void QgsMarkerLineSymbolLayerWidget::setOffset()
void QgsMarkerLineSymbolLayerWidget::setPlacement()
{
const bool interval = radInterval->isChecked();
const bool interval = mCheckInterval->isChecked();
spinInterval->setEnabled( interval );
mSpinOffsetAlongLine->setEnabled( radInterval->isChecked() || radVertexLast->isChecked() || radVertexFirst->isChecked() );
mSpinOffsetAlongLine->setEnabled( mCheckInterval->isChecked() || mCheckVertexLast->isChecked() || mCheckVertexFirst->isChecked() );
mOffsetAlongLineUnitWidget->setEnabled( mSpinOffsetAlongLine->isEnabled() );
mSpinAverageAngleLength->setEnabled( chkRotateMarker->isChecked() && ( radInterval->isChecked() || radCentralPoint->isChecked() ) );
mSpinAverageAngleLength->setEnabled( chkRotateMarker->isChecked() && ( mCheckInterval->isChecked() || mCheckCentralPoint->isChecked() ) );
mAverageAngleUnit->setEnabled( mSpinAverageAngleLength->isEnabled() );
//mLayer->setPlacement( interval ? QgsMarkerLineSymbolLayer::Interval : QgsMarkerLineSymbolLayer::Vertex );
if ( radInterval->isChecked() )
mLayer->setPlacement( Qgis::MarkerLinePlacement::Interval );
else if ( radVertex->isChecked() )
mLayer->setPlacement( Qgis::MarkerLinePlacement::Vertex );
else if ( radVertexLast->isChecked() )
mLayer->setPlacement( Qgis::MarkerLinePlacement::LastVertex );
else if ( radVertexFirst->isChecked() )
mLayer->setPlacement( Qgis::MarkerLinePlacement::FirstVertex );
else if ( radCurvePoint->isChecked() )
mLayer->setPlacement( Qgis::MarkerLinePlacement::CurvePoint );
else if ( radSegmentCentralPoint->isChecked() )
mLayer->setPlacement( Qgis::MarkerLinePlacement::SegmentCenter );
else
mLayer->setPlacement( Qgis::MarkerLinePlacement::CentralPoint );
Qgis::MarkerLinePlacements placements;
if ( mCheckInterval->isChecked() )
placements |= Qgis::MarkerLinePlacement::Interval;
if ( mCheckVertex->isChecked() )
placements |= Qgis::MarkerLinePlacement::Vertex;
if ( mCheckVertexLast->isChecked() )
placements |= Qgis::MarkerLinePlacement::LastVertex;
if ( mCheckVertexFirst->isChecked() )
placements |= Qgis::MarkerLinePlacement::FirstVertex;
if ( mCheckCurvePoint->isChecked() )
placements |= Qgis::MarkerLinePlacement::CurvePoint;
if ( mCheckSegmentCentralPoint->isChecked() )
placements |= Qgis::MarkerLinePlacement::SegmentCenter;
if ( mCheckCentralPoint->isChecked() )
placements |= Qgis::MarkerLinePlacement::CentralPoint;
mLayer->setPlacements( placements );
emit changed();
}
@ -2177,13 +2173,14 @@ QgsHashedLineSymbolLayerWidget::QgsHashedLineSymbolLayerWidget( QgsVectorLayer *
connect( chkRotateMarker, &QAbstractButton::clicked, this, &QgsHashedLineSymbolLayerWidget::setRotate );
connect( spinOffset, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsHashedLineSymbolLayerWidget::setOffset );
connect( mSpinAverageAngleLength, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsHashedLineSymbolLayerWidget::setAverageAngle );
connect( radInterval, &QAbstractButton::clicked, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( radVertex, &QAbstractButton::clicked, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( radVertexLast, &QAbstractButton::clicked, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( radVertexFirst, &QAbstractButton::clicked, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( radCentralPoint, &QAbstractButton::clicked, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( radCurvePoint, &QAbstractButton::clicked, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( radSegmentCentralPoint, &QAbstractButton::clicked, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( mCheckInterval, &QCheckBox::toggled, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( mCheckVertex, &QCheckBox::toggled, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( mCheckVertexLast, &QCheckBox::toggled, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( mCheckVertexFirst, &QCheckBox::toggled, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( mCheckCentralPoint, &QCheckBox::toggled, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( mCheckCurvePoint, &QCheckBox::toggled, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
connect( mCheckSegmentCentralPoint, &QCheckBox::toggled, this, &QgsHashedLineSymbolLayerWidget::setPlacement );
}
void QgsHashedLineSymbolLayerWidget::setSymbolLayer( QgsSymbolLayer *layer )
@ -2209,20 +2206,14 @@ void QgsHashedLineSymbolLayerWidget::setSymbolLayer( QgsSymbolLayer *layer )
spinOffset->blockSignals( true );
spinOffset->setValue( mLayer->offset() );
spinOffset->blockSignals( false );
if ( mLayer->placement() == Qgis::MarkerLinePlacement::Interval )
radInterval->setChecked( true );
else if ( mLayer->placement() == Qgis::MarkerLinePlacement::Vertex )
radVertex->setChecked( true );
else if ( mLayer->placement() == Qgis::MarkerLinePlacement::LastVertex )
radVertexLast->setChecked( true );
else if ( mLayer->placement() == Qgis::MarkerLinePlacement::CentralPoint )
radCentralPoint->setChecked( true );
else if ( mLayer->placement() == Qgis::MarkerLinePlacement::CurvePoint )
radCurvePoint->setChecked( true );
else if ( mLayer->placement() == Qgis::MarkerLinePlacement::SegmentCenter )
radSegmentCentralPoint->setChecked( true );
else
radVertexFirst->setChecked( true );
whileBlocking( mCheckInterval )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::Interval );
whileBlocking( mCheckVertex )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::Vertex );
whileBlocking( mCheckVertexFirst )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::FirstVertex );
whileBlocking( mCheckVertexLast )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::LastVertex );
whileBlocking( mCheckCentralPoint )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::CentralPoint );
whileBlocking( mCheckCurvePoint )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::CurvePoint );
whileBlocking( mCheckSegmentCentralPoint )->setChecked( mLayer->placements() & Qgis::MarkerLinePlacement::SegmentCenter );
// set units
mIntervalUnitWidget->blockSignals( true );
@ -2306,7 +2297,7 @@ void QgsHashedLineSymbolLayerWidget::setHashAngle( double val )
void QgsHashedLineSymbolLayerWidget::setRotate()
{
mSpinAverageAngleLength->setEnabled( chkRotateMarker->isChecked() && ( radInterval->isChecked() || radCentralPoint->isChecked() ) );
mSpinAverageAngleLength->setEnabled( chkRotateMarker->isChecked() && ( mCheckInterval->isChecked() || mCheckCentralPoint->isChecked() ) );
mAverageAngleUnit->setEnabled( mSpinAverageAngleLength->isEnabled() );
mLayer->setRotateSymbols( chkRotateMarker->isChecked() );
@ -2321,27 +2312,29 @@ void QgsHashedLineSymbolLayerWidget::setOffset()
void QgsHashedLineSymbolLayerWidget::setPlacement()
{
const bool interval = radInterval->isChecked();
const bool interval = mCheckInterval->isChecked();
spinInterval->setEnabled( interval );
mSpinOffsetAlongLine->setEnabled( radInterval->isChecked() || radVertexLast->isChecked() || radVertexFirst->isChecked() );
mSpinOffsetAlongLine->setEnabled( mCheckInterval->isChecked() || mCheckVertexLast->isChecked() || mCheckVertexFirst->isChecked() );
mOffsetAlongLineUnitWidget->setEnabled( mSpinOffsetAlongLine->isEnabled() );
mSpinAverageAngleLength->setEnabled( chkRotateMarker->isChecked() && ( radInterval->isChecked() || radCentralPoint->isChecked() ) );
mSpinAverageAngleLength->setEnabled( chkRotateMarker->isChecked() && ( mCheckInterval->isChecked() || mCheckCentralPoint->isChecked() ) );
mAverageAngleUnit->setEnabled( mSpinAverageAngleLength->isEnabled() );
//mLayer->setPlacement( interval ? QgsMarkerLineSymbolLayer::Interval : QgsMarkerLineSymbolLayer::Vertex );
if ( radInterval->isChecked() )
mLayer->setPlacement( Qgis::MarkerLinePlacement::Interval );
else if ( radVertex->isChecked() )
mLayer->setPlacement( Qgis::MarkerLinePlacement::Vertex );
else if ( radVertexLast->isChecked() )
mLayer->setPlacement( Qgis::MarkerLinePlacement::LastVertex );
else if ( radVertexFirst->isChecked() )
mLayer->setPlacement( Qgis::MarkerLinePlacement::FirstVertex );
else if ( radCurvePoint->isChecked() )
mLayer->setPlacement( Qgis::MarkerLinePlacement::CurvePoint );
else if ( radSegmentCentralPoint->isChecked() )
mLayer->setPlacement( Qgis::MarkerLinePlacement::SegmentCenter );
else
mLayer->setPlacement( Qgis::MarkerLinePlacement::CentralPoint );
Qgis::MarkerLinePlacements placements;
if ( mCheckInterval->isChecked() )
placements |= Qgis::MarkerLinePlacement::Interval;
if ( mCheckVertex->isChecked() )
placements |= Qgis::MarkerLinePlacement::Vertex;
if ( mCheckVertexLast->isChecked() )
placements |= Qgis::MarkerLinePlacement::LastVertex;
if ( mCheckVertexFirst->isChecked() )
placements |= Qgis::MarkerLinePlacement::FirstVertex;
if ( mCheckCurvePoint->isChecked() )
placements |= Qgis::MarkerLinePlacement::CurvePoint;
if ( mCheckSegmentCentralPoint->isChecked() )
placements |= Qgis::MarkerLinePlacement::SegmentCenter;
if ( mCheckCentralPoint->isChecked() )
placements |= Qgis::MarkerLinePlacement::CentralPoint;
mLayer->setPlacements( placements );
emit changed();
}

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>371</width>
<height>380</height>
<width>385</width>
<height>502</height>
</rect>
</property>
<property name="windowTitle">
@ -44,7 +44,7 @@
<item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QRadioButton" name="radInterval">
<widget class="QCheckBox" name="mCheckInterval">
<property name="text">
<string>with interval</string>
</property>
@ -93,20 +93,6 @@
</item>
</layout>
</item>
<item row="4" column="1">
<widget class="QRadioButton" name="radVertex">
<property name="text">
<string>on every vertex</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QRadioButton" name="radVertexLast">
<property name="text">
<string>on last vertex only</string>
</property>
</widget>
</item>
<item row="6" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
@ -123,20 +109,6 @@
</property>
</spacer>
</item>
<item row="6" column="1">
<widget class="QRadioButton" name="radVertexFirst">
<property name="text">
<string>on first vertex only</string>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QRadioButton" name="radCurvePoint">
<property name="text">
<string>on every curve point</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QgsPropertyOverrideButton" name="mIntervalDDBtn">
<property name="text">
@ -144,20 +116,48 @@
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="mCheckVertex">
<property name="text">
<string>on every vertex</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="mCheckVertexLast">
<property name="text">
<string>on last vertex only</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="mCheckVertexFirst">
<property name="text">
<string>on first vertex only</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QRadioButton" name="radCentralPoint">
<widget class="QCheckBox" name="mCheckCentralPoint">
<property name="text">
<string>on central point</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QRadioButton" name="radSegmentCentralPoint">
<widget class="QCheckBox" name="mCheckSegmentCentralPoint">
<property name="text">
<string>on central point of segments</string>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QCheckBox" name="mCheckCurvePoint">
<property name="text">
<string>on every curve point</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="5" column="1" colspan="2">
@ -493,16 +493,16 @@
</customwidgets>
<tabstops>
<tabstop>mPlacementDDBtn</tabstop>
<tabstop>radInterval</tabstop>
<tabstop>mCheckInterval</tabstop>
<tabstop>spinInterval</tabstop>
<tabstop>mIntervalUnitWidget</tabstop>
<tabstop>mIntervalDDBtn</tabstop>
<tabstop>radVertex</tabstop>
<tabstop>radVertexLast</tabstop>
<tabstop>radVertexFirst</tabstop>
<tabstop>radCentralPoint</tabstop>
<tabstop>radSegmentCentralPoint</tabstop>
<tabstop>radCurvePoint</tabstop>
<tabstop>mCheckVertex</tabstop>
<tabstop>mCheckVertexLast</tabstop>
<tabstop>mCheckVertexFirst</tabstop>
<tabstop>mCheckCentralPoint</tabstop>
<tabstop>mCheckSegmentCentralPoint</tabstop>
<tabstop>mCheckCurvePoint</tabstop>
<tabstop>mSpinOffsetAlongLine</tabstop>
<tabstop>mOffsetAlongLineUnitWidget</tabstop>
<tabstop>mOffsetAlongLineDDBtn</tabstop>

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>371</width>
<height>348</height>
<width>385</width>
<height>434</height>
</rect>
</property>
<property name="windowTitle">
@ -41,20 +41,6 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item row="5" column="1">
<widget class="QRadioButton" name="radVertexLast">
<property name="text">
<string>on last vertex only</string>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QRadioButton" name="radCurvePoint">
<property name="text">
<string>on every curve point</string>
</property>
</widget>
</item>
<item row="6" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
@ -78,24 +64,10 @@
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QRadioButton" name="radVertexFirst">
<property name="text">
<string>on first vertex only</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QRadioButton" name="radVertex">
<property name="text">
<string>on every vertex</string>
</property>
</widget>
</item>
<item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QRadioButton" name="radInterval">
<widget class="QCheckBox" name="mCheckInterval">
<property name="text">
<string>with interval</string>
</property>
@ -144,20 +116,48 @@
</item>
</layout>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="mCheckVertex">
<property name="text">
<string>on every vertex</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="mCheckVertexLast">
<property name="text">
<string>on last vertex only</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="mCheckVertexFirst">
<property name="text">
<string>on first vertex only</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QRadioButton" name="radCentralPoint">
<widget class="QCheckBox" name="mCheckCentralPoint">
<property name="text">
<string>on central point</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QRadioButton" name="radSegmentCentralPoint">
<widget class="QCheckBox" name="mCheckSegmentCentralPoint">
<property name="text">
<string>on central point of segments</string>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QCheckBox" name="mCheckCurvePoint">
<property name="text">
<string>on every curve point</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="5" column="1" colspan="2">
@ -402,16 +402,16 @@
</customwidgets>
<tabstops>
<tabstop>mPlacementDDBtn</tabstop>
<tabstop>radInterval</tabstop>
<tabstop>mCheckInterval</tabstop>
<tabstop>spinInterval</tabstop>
<tabstop>mIntervalUnitWidget</tabstop>
<tabstop>mIntervalDDBtn</tabstop>
<tabstop>radVertex</tabstop>
<tabstop>radVertexLast</tabstop>
<tabstop>radVertexFirst</tabstop>
<tabstop>radCentralPoint</tabstop>
<tabstop>radSegmentCentralPoint</tabstop>
<tabstop>radCurvePoint</tabstop>
<tabstop>mCheckVertex</tabstop>
<tabstop>mCheckVertexLast</tabstop>
<tabstop>mCheckVertexFirst</tabstop>
<tabstop>mCheckCentralPoint</tabstop>
<tabstop>mCheckSegmentCentralPoint</tabstop>
<tabstop>mCheckCurvePoint</tabstop>
<tabstop>mSpinOffsetAlongLine</tabstop>
<tabstop>mOffsetAlongLineUnitWidget</tabstop>
<tabstop>mOffsetAlongLineDDBtn</tabstop>

View File

@ -357,11 +357,11 @@ void TestQgsLineFillSymbol::lineFillClipPainter()
QgsMarkerSymbol *pointSymbol = QgsMarkerSymbol::createSimple( properties );
QgsMarkerLineSymbolLayer *markerLine = new QgsMarkerLineSymbolLayer();
markerLine->setSubSymbol( pointSymbol->clone() );
markerLine->setPlacement( Qgis::MarkerLinePlacement::FirstVertex );
markerLine->setPlacements( Qgis::MarkerLinePlacement::FirstVertex );
lineSymbol->appendSymbolLayer( markerLine );
markerLine = new QgsMarkerLineSymbolLayer();
markerLine->setSubSymbol( pointSymbol );
markerLine->setPlacement( Qgis::MarkerLinePlacement::LastVertex );
markerLine->setPlacements( Qgis::MarkerLinePlacement::LastVertex );
lineSymbol->appendSymbolLayer( markerLine );
lineFill->setSubSymbol( lineSymbol );
@ -396,11 +396,11 @@ void TestQgsLineFillSymbol::lineFillClipIntersection()
QgsMarkerSymbol *pointSymbol = QgsMarkerSymbol::createSimple( properties );
QgsMarkerLineSymbolLayer *markerLine = new QgsMarkerLineSymbolLayer();
markerLine->setSubSymbol( pointSymbol->clone() );
markerLine->setPlacement( Qgis::MarkerLinePlacement::FirstVertex );
markerLine->setPlacements( Qgis::MarkerLinePlacement::FirstVertex );
lineSymbol->appendSymbolLayer( markerLine );
markerLine = new QgsMarkerLineSymbolLayer();
markerLine->setSubSymbol( pointSymbol );
markerLine->setPlacement( Qgis::MarkerLinePlacement::LastVertex );
markerLine->setPlacements( Qgis::MarkerLinePlacement::LastVertex );
lineSymbol->appendSymbolLayer( markerLine );
lineFill->setSubSymbol( lineSymbol );
@ -435,11 +435,11 @@ void TestQgsLineFillSymbol::lineFillNoClip()
QgsMarkerSymbol *pointSymbol = QgsMarkerSymbol::createSimple( properties );
QgsMarkerLineSymbolLayer *markerLine = new QgsMarkerLineSymbolLayer();
markerLine->setSubSymbol( pointSymbol->clone() );
markerLine->setPlacement( Qgis::MarkerLinePlacement::FirstVertex );
markerLine->setPlacements( Qgis::MarkerLinePlacement::FirstVertex );
lineSymbol->appendSymbolLayer( markerLine );
markerLine = new QgsMarkerLineSymbolLayer();
markerLine->setSubSymbol( pointSymbol );
markerLine->setPlacement( Qgis::MarkerLinePlacement::LastVertex );
markerLine->setPlacements( Qgis::MarkerLinePlacement::LastVertex );
lineSymbol->appendSymbolLayer( markerLine );
lineFill->setSubSymbol( lineSymbol );
@ -474,11 +474,11 @@ void TestQgsLineFillSymbol::lineFillDataDefinedClip()
QgsMarkerSymbol *pointSymbol = QgsMarkerSymbol::createSimple( properties );
QgsMarkerLineSymbolLayer *markerLine = new QgsMarkerLineSymbolLayer();
markerLine->setSubSymbol( pointSymbol->clone() );
markerLine->setPlacement( Qgis::MarkerLinePlacement::FirstVertex );
markerLine->setPlacements( Qgis::MarkerLinePlacement::FirstVertex );
lineSymbol->appendSymbolLayer( markerLine );
markerLine = new QgsMarkerLineSymbolLayer();
markerLine->setSubSymbol( pointSymbol );
markerLine->setPlacement( Qgis::MarkerLinePlacement::LastVertex );
markerLine->setPlacements( Qgis::MarkerLinePlacement::LastVertex );
lineSymbol->appendSymbolLayer( markerLine );
lineFill->setSubSymbol( lineSymbol );

View File

@ -146,7 +146,7 @@ void TestQgsMarkerLineSymbol::pointNumInterval()
mMapSettings->setLayers( QList<QgsMapLayer *>() << mLinesLayer );
QgsMarkerLineSymbolLayer *ml = new QgsMarkerLineSymbolLayer();
ml->setPlacement( Qgis::MarkerLinePlacement::Interval );
ml->setPlacements( Qgis::MarkerLinePlacement::Interval );
ml->setInterval( 4 );
QgsLineSymbol *lineSymbol = new QgsLineSymbol();
lineSymbol->changeSymbolLayer( 0, ml );
@ -176,7 +176,7 @@ void TestQgsMarkerLineSymbol::pointNumVertex()
mMapSettings->setLayers( QList<QgsMapLayer *>() << mLinesLayer );
QgsMarkerLineSymbolLayer *ml = new QgsMarkerLineSymbolLayer();
ml->setPlacement( Qgis::MarkerLinePlacement::Vertex );
ml->setPlacements( Qgis::MarkerLinePlacement::Vertex );
QgsLineSymbol *lineSymbol = new QgsLineSymbol();
lineSymbol->changeSymbolLayer( 0, ml );
QgsSingleSymbolRenderer *r = new QgsSingleSymbolRenderer( lineSymbol );

View File

@ -179,7 +179,7 @@ void TestQgsSymbol::testCanvasClip()
ms.setLayers( QList<QgsMapLayer *>() << mpLinesLayer );
QgsMarkerLineSymbolLayer *markerLine = new QgsMarkerLineSymbolLayer();
markerLine->setPlacement( Qgis::MarkerLinePlacement::CentralPoint );
markerLine->setPlacements( Qgis::MarkerLinePlacement::CentralPoint );
static_cast< QgsSimpleMarkerSymbolLayer *>( markerLine->subSymbol()->symbolLayer( 0 ) )->setStrokeColor( Qt::black );
QgsLineSymbol *lineSymbol = new QgsLineSymbol();
lineSymbol->changeSymbolLayer( 0, markerLine );

View File

@ -30,7 +30,8 @@ from qgis.PyQt.QtCore import QDir, Qt, QSize
from qgis.PyQt.QtGui import QImage, QColor, QPainter
from qgis.PyQt.QtXml import QDomDocument
from qgis.core import (QgsGeometry,
from qgis.core import (Qgis,
QgsGeometry,
QgsFillSymbol,
QgsRenderContext,
QgsFeature,
@ -105,6 +106,24 @@ class TestQgsMarkerLineSymbolLayer(unittest.TestCase):
self.assertAlmostEqual(marker_line.width(context), 10.0, 3)
self.assertAlmostEqual(marker_line.width(context2), 10.0, 3)
def testMultiplePlacements(self):
line_symbol = QgsLineSymbol()
line_symbol.deleteSymbolLayer(0)
line_symbol.appendSymbolLayer(
QgsMarkerLineSymbolLayer())
line_symbol[0].setPlacements(Qgis.MarkerLinePlacements(Qgis.MarkerLinePlacement.FirstVertex | Qgis.MarkerLinePlacement.LastVertex))
marker = QgsSimpleMarkerSymbolLayer(QgsSimpleMarkerSymbolLayer.Triangle, 4)
marker.setColor(QColor(255, 0, 0))
marker.setStrokeStyle(Qt.NoPen)
marker_symbol = QgsMarkerSymbol()
marker_symbol.changeSymbolLayer(0, marker)
line_symbol[0].setSubSymbol(marker_symbol)
g = QgsGeometry.fromWkt('LineString(0 0, 10 0, 10 10, 0 10)')
rendered_image = self.renderGeometry(line_symbol, g)
assert self.imageCheck('markerline_multiple_placement', 'markerline_multiple_placement', rendered_image)
def testRingFilter(self):
# test filtering rings during rendering
s = QgsFillSymbol()