Skip to content

Commit

Permalink
Update diagram renderer to use rotation in degrees clockwise
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed May 30, 2017
1 parent f9c48bf commit d705642
Show file tree
Hide file tree
Showing 9 changed files with 52 additions and 32 deletions.
1 change: 1 addition & 0 deletions doc/api_break.dox
Expand Up @@ -1024,6 +1024,7 @@ QgsDiagramSettings {#qgis_api_break_3_0_QgsDiagramSettings}
- The SizeType enum was removed. Use QgsUnitTypes.RenderUnit instead.
- readXml() and writeXml() do not take QgsVectorLayer as an argument anymore.
- transparency was removed. Use opacity instead.
- angleOffset was removed. Use rotationOffset instead.


QgsDial {#qgis_api_break_3_0_QgsDial}
Expand Down
7 changes: 6 additions & 1 deletion python/core/qgsdiagramrenderer.sip
Expand Up @@ -365,7 +365,12 @@ Opacity, from 0 (transparent) to 1.0 (opaque)
%End

bool scaleByArea;
int angleOffset;

double rotationOffset;
%Docstring
Rotation offset, in degrees clockwise from horizontal.
.. versionadded:: 3.0
%End

bool scaleBasedVisibility;
double minScaleDenominator;
Expand Down
10 changes: 5 additions & 5 deletions src/app/qgsdiagramproperties.cpp
Expand Up @@ -147,10 +147,10 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer *layer, QWidget *pare
mScaleDependencyComboBox->addItem( tr( "Area" ), true );
mScaleDependencyComboBox->addItem( tr( "Diameter" ), false );

mAngleOffsetComboBox->addItem( tr( "Top" ), 90 * 16 );
mAngleOffsetComboBox->addItem( tr( "Top" ), 270 );
mAngleOffsetComboBox->addItem( tr( "Right" ), 0 );
mAngleOffsetComboBox->addItem( tr( "Bottom" ), 270 * 16 );
mAngleOffsetComboBox->addItem( tr( "Left" ), 180 * 16 );
mAngleOffsetComboBox->addItem( tr( "Bottom" ), 90 );
mAngleOffsetComboBox->addItem( tr( "Left" ), 180 );

QgsSettings settings;

Expand Down Expand Up @@ -283,7 +283,7 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer *layer, QWidget *pare
mLabelPlacementComboBox->setCurrentIndex( 1 );
}

mAngleOffsetComboBox->setCurrentIndex( mAngleOffsetComboBox->findData( settingList.at( 0 ).angleOffset ) );
mAngleOffsetComboBox->setCurrentIndex( mAngleOffsetComboBox->findData( settingList.at( 0 ).rotationOffset ) );

mOrientationLeftButton->setProperty( "direction", QgsDiagramSettings::Left );
mOrientationRightButton->setProperty( "direction", QgsDiagramSettings::Right );
Expand Down Expand Up @@ -779,7 +779,7 @@ void QgsDiagramProperties::apply()
ds.scaleBasedVisibility = mScaleVisibilityGroupBox->isChecked();

// Diagram angle offset (pie)
ds.angleOffset = mAngleOffsetComboBox->currentData().toInt();
ds.rotationOffset = mAngleOffsetComboBox->currentData().toInt();

// Diagram orientation (histogram)
ds.diagramOrientation = static_cast<QgsDiagramSettings::DiagramOrientation>( mOrientationButtonGroup->checkedButton()->property( "direction" ).toInt() );
Expand Down
2 changes: 1 addition & 1 deletion src/core/diagram/qgspiediagram.cpp
Expand Up @@ -138,7 +138,7 @@ void QgsPieDiagram::renderDiagram( const QgsFeature &feature, QgsRenderContext &
}
else
{
p->drawPie( baseX, baseY, w, h, totalAngle + s.angleOffset, currentAngle );
p->drawPie( baseX, baseY, w, h, totalAngle - s.rotationOffset * 16.0, currentAngle );
}
totalAngle += currentAngle;
}
Expand Down
11 changes: 7 additions & 4 deletions src/core/qgsdiagramrenderer.cpp
Expand Up @@ -255,7 +255,10 @@ void QgsDiagramSettings::readXml( const QDomElement &elem )

barWidth = elem.attribute( QStringLiteral( "barWidth" ) ).toDouble();

angleOffset = elem.attribute( QStringLiteral( "angleOffset" ) ).toInt();
if ( elem.hasAttribute( QStringLiteral( "angleOffset" ) ) )
rotationOffset = fmod( 360.0 - elem.attribute( QStringLiteral( "angleOffset" ) ).toInt() / 16.0, 360.0 );
else
rotationOffset = elem.attribute( QStringLiteral( "rotationOffset" ) ).toDouble();

minimumSize = elem.attribute( QStringLiteral( "minimumSize" ) ).toDouble();

Expand Down Expand Up @@ -374,7 +377,7 @@ void QgsDiagramSettings::writeXml( QDomElement &rendererElem, QDomDocument &doc

categoryElem.setAttribute( QStringLiteral( "barWidth" ), QString::number( barWidth ) );
categoryElem.setAttribute( QStringLiteral( "minimumSize" ), QString::number( minimumSize ) );
categoryElem.setAttribute( QStringLiteral( "angleOffset" ), QString::number( angleOffset ) );
categoryElem.setAttribute( QStringLiteral( "rotationOffset" ), QString::number( rotationOffset ) );

int nCats = qMin( categoryColors.size(), categoryAttributes.size() );
for ( int i = 0; i < nCats; ++i )
Expand Down Expand Up @@ -447,8 +450,8 @@ void QgsDiagramRenderer::renderDiagram( const QgsFeature &feature, QgsRenderCont
s.penColor = properties.valueAsColor( QgsDiagramLayerSettings::StrokeColor, c.expressionContext(), s.penColor );
c.expressionContext().setOriginalValueVariable( s.penWidth );
s.penWidth = properties.valueAsDouble( QgsDiagramLayerSettings::StrokeWidth, c.expressionContext(), s.penWidth );
c.expressionContext().setOriginalValueVariable( s.angleOffset / 16.0 );
s.angleOffset = 16.0 * properties.valueAsDouble( QgsDiagramLayerSettings::StartAngle, c.expressionContext(), s.angleOffset / 16.0 );
c.expressionContext().setOriginalValueVariable( s.rotationOffset );
s.rotationOffset = properties.valueAsDouble( QgsDiagramLayerSettings::StartAngle, c.expressionContext(), s.rotationOffset );
}

mDiagram->renderDiagram( feature, c, s, pos );
Expand Down
9 changes: 7 additions & 2 deletions src/core/qgsdiagramrenderer.h
Expand Up @@ -374,7 +374,7 @@ class CORE_EXPORT QgsDiagramSettings
, barWidth( 5.0 )
, opacity( 1.0 )
, scaleByArea( true )
, angleOffset( 90 * 16 ) //top
, rotationOffset( 270 ) //top
, scaleBasedVisibility( false )
, minScaleDenominator( -1 )
, maxScaleDenominator( -1 )
Expand Down Expand Up @@ -418,7 +418,12 @@ class CORE_EXPORT QgsDiagramSettings
double opacity;

bool scaleByArea;
int angleOffset;

/**
* Rotation offset, in degrees clockwise from horizontal.
* \since QGIS 3.0
*/
double rotationOffset;

bool scaleBasedVisibility;
//scale range (-1 if no lower / upper bound )
Expand Down
3 changes: 2 additions & 1 deletion src/core/qgsmapsettings.cpp
Expand Up @@ -106,7 +106,8 @@ double QgsMapSettings::rotation() const

void QgsMapSettings::setRotation( double degrees )
{
if ( qgsDoubleNear( mRotation, degrees ) ) return;
if ( qgsDoubleNear( mRotation, degrees ) )
return;

mRotation = degrees;

Expand Down
19 changes: 12 additions & 7 deletions src/core/qgsmapsettings.h
Expand Up @@ -76,14 +76,19 @@ class CORE_EXPORT QgsMapSettings
//! Set the size of the resulting map image
void setOutputSize( QSize size );

//! Return the rotation of the resulting map image
//! Units are clockwise degrees
//! \since QGIS 2.8
/**
* Returns the rotation of the resulting map image, in degrees clockwise.
* \since QGIS 2.8
* \see setRotation()
*/
double rotation() const;
//! Set the rotation of the resulting map image
//! Units are clockwise degrees
//! \since QGIS 2.8
void setRotation( double degrees );

/**
* Sets the \a rotation of the resulting map image, in degrees clockwise.
* \since QGIS 2.8
* \see rotation()
*/
void setRotation( double rotation );

//! Return DPI used for conversion between real world units (e.g. mm) and pixels
//! Default value is 96
Expand Down
22 changes: 11 additions & 11 deletions tests/src/core/testqgsdiagram.cpp
Expand Up @@ -153,7 +153,7 @@ class TestQgsDiagram : public QObject
ds.scaleByArea = true;
ds.sizeType = QgsUnitTypes::RenderMillimeters;
ds.size = QSizeF( 5, 5 );
ds.angleOffset = 0;
ds.rotationOffset = 270;

QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
dr->setLowerValue( 0.0 );
Expand Down Expand Up @@ -190,7 +190,7 @@ class TestQgsDiagram : public QObject
ds.scaleByArea = true;
ds.sizeType = QgsUnitTypes::RenderMillimeters;
ds.size = QSizeF( 5, 5 );
ds.angleOffset = 0;
ds.rotationOffset = 270;

QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
dr->setLowerValue( 0.0 );
Expand Down Expand Up @@ -232,7 +232,7 @@ class TestQgsDiagram : public QObject
ds.scaleByArea = true;
ds.sizeType = QgsUnitTypes::RenderMillimeters;
ds.size = QSizeF( 15, 15 );
ds.angleOffset = 0;
ds.rotationOffset = 270;

QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
dr->setDiagram( new QgsPieDiagram() );
Expand Down Expand Up @@ -269,7 +269,7 @@ class TestQgsDiagram : public QObject
ds.scaleByArea = true;
ds.sizeType = QgsUnitTypes::RenderMillimeters;
ds.size = QSizeF( 15, 15 );
ds.angleOffset = 0;
ds.rotationOffset = 270;

QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
dr->setDiagram( new QgsPieDiagram() );
Expand Down Expand Up @@ -306,7 +306,7 @@ class TestQgsDiagram : public QObject
ds.scaleByArea = true;
ds.sizeType = QgsUnitTypes::RenderMillimeters;
ds.size = QSizeF( 15, 15 );
ds.angleOffset = 0;
ds.rotationOffset = 270;

QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
dr->setDiagram( new QgsPieDiagram() );
Expand Down Expand Up @@ -342,7 +342,7 @@ class TestQgsDiagram : public QObject
ds.scaleByArea = true;
ds.sizeType = QgsUnitTypes::RenderMillimeters;
ds.size = QSizeF( 15, 15 );
ds.angleOffset = 0;
ds.rotationOffset = 270;

QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
dr->setDiagram( new QgsPieDiagram() );
Expand Down Expand Up @@ -378,7 +378,7 @@ class TestQgsDiagram : public QObject
ds.scaleByArea = true;
ds.sizeType = QgsUnitTypes::RenderMillimeters;
ds.size = QSizeF( 15, 15 );
ds.angleOffset = 0;
ds.rotationOffset = 270;

QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
dr->setDiagram( new QgsPieDiagram() );
Expand Down Expand Up @@ -414,7 +414,7 @@ class TestQgsDiagram : public QObject
ds.scaleByArea = true;
ds.sizeType = QgsUnitTypes::RenderMillimeters;
ds.size = QSizeF( 50, 50 );
ds.angleOffset = 0;
ds.rotationOffset = 270;

QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
dr->setDiagram( new QgsPieDiagram() );
Expand Down Expand Up @@ -448,7 +448,7 @@ class TestQgsDiagram : public QObject
ds.scaleByArea = true;
ds.sizeType = QgsUnitTypes::RenderMillimeters;
ds.size = QSizeF( 50, 50 );
ds.angleOffset = 0;
ds.rotationOffset = 270;

QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
dr->setDiagram( new QgsPieDiagram() );
Expand Down Expand Up @@ -484,7 +484,7 @@ class TestQgsDiagram : public QObject
ds.scaleByArea = true;
ds.sizeType = QgsUnitTypes::RenderMillimeters;
ds.size = QSizeF( 50, 50 );
ds.angleOffset = 0;
ds.rotationOffset = 270;

QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
dr->setDiagram( new QgsPieDiagram() );
Expand Down Expand Up @@ -525,7 +525,7 @@ class TestQgsDiagram : public QObject
ds.scaleByArea = true;
ds.sizeType = QgsUnitTypes::RenderMillimeters;
ds.size = QSizeF( 15, 15 );
ds.angleOffset = 0;
ds.rotationOffset = 270;

QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
dr->setDiagram( new QgsTextDiagram() );
Expand Down

0 comments on commit d705642

Please sign in to comment.