mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-14 00:07:35 -04:00
Update diagram renderer to use rotation in degrees clockwise
This commit is contained in:
parent
f9c48bf0ce
commit
d705642fb3
@ -1024,6 +1024,7 @@ QgsDiagramSettings {#qgis_api_break_3_0_QgsDiagramSettings}
|
|||||||
- The SizeType enum was removed. Use QgsUnitTypes.RenderUnit instead.
|
- The SizeType enum was removed. Use QgsUnitTypes.RenderUnit instead.
|
||||||
- readXml() and writeXml() do not take QgsVectorLayer as an argument anymore.
|
- readXml() and writeXml() do not take QgsVectorLayer as an argument anymore.
|
||||||
- transparency was removed. Use opacity instead.
|
- transparency was removed. Use opacity instead.
|
||||||
|
- angleOffset was removed. Use rotationOffset instead.
|
||||||
|
|
||||||
|
|
||||||
QgsDial {#qgis_api_break_3_0_QgsDial}
|
QgsDial {#qgis_api_break_3_0_QgsDial}
|
||||||
|
@ -365,7 +365,12 @@ Opacity, from 0 (transparent) to 1.0 (opaque)
|
|||||||
%End
|
%End
|
||||||
|
|
||||||
bool scaleByArea;
|
bool scaleByArea;
|
||||||
int angleOffset;
|
|
||||||
|
double rotationOffset;
|
||||||
|
%Docstring
|
||||||
|
Rotation offset, in degrees clockwise from horizontal.
|
||||||
|
.. versionadded:: 3.0
|
||||||
|
%End
|
||||||
|
|
||||||
bool scaleBasedVisibility;
|
bool scaleBasedVisibility;
|
||||||
double minScaleDenominator;
|
double minScaleDenominator;
|
||||||
|
@ -147,10 +147,10 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer *layer, QWidget *pare
|
|||||||
mScaleDependencyComboBox->addItem( tr( "Area" ), true );
|
mScaleDependencyComboBox->addItem( tr( "Area" ), true );
|
||||||
mScaleDependencyComboBox->addItem( tr( "Diameter" ), false );
|
mScaleDependencyComboBox->addItem( tr( "Diameter" ), false );
|
||||||
|
|
||||||
mAngleOffsetComboBox->addItem( tr( "Top" ), 90 * 16 );
|
mAngleOffsetComboBox->addItem( tr( "Top" ), 270 );
|
||||||
mAngleOffsetComboBox->addItem( tr( "Right" ), 0 );
|
mAngleOffsetComboBox->addItem( tr( "Right" ), 0 );
|
||||||
mAngleOffsetComboBox->addItem( tr( "Bottom" ), 270 * 16 );
|
mAngleOffsetComboBox->addItem( tr( "Bottom" ), 90 );
|
||||||
mAngleOffsetComboBox->addItem( tr( "Left" ), 180 * 16 );
|
mAngleOffsetComboBox->addItem( tr( "Left" ), 180 );
|
||||||
|
|
||||||
QgsSettings settings;
|
QgsSettings settings;
|
||||||
|
|
||||||
@ -283,7 +283,7 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer *layer, QWidget *pare
|
|||||||
mLabelPlacementComboBox->setCurrentIndex( 1 );
|
mLabelPlacementComboBox->setCurrentIndex( 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
mAngleOffsetComboBox->setCurrentIndex( mAngleOffsetComboBox->findData( settingList.at( 0 ).angleOffset ) );
|
mAngleOffsetComboBox->setCurrentIndex( mAngleOffsetComboBox->findData( settingList.at( 0 ).rotationOffset ) );
|
||||||
|
|
||||||
mOrientationLeftButton->setProperty( "direction", QgsDiagramSettings::Left );
|
mOrientationLeftButton->setProperty( "direction", QgsDiagramSettings::Left );
|
||||||
mOrientationRightButton->setProperty( "direction", QgsDiagramSettings::Right );
|
mOrientationRightButton->setProperty( "direction", QgsDiagramSettings::Right );
|
||||||
@ -779,7 +779,7 @@ void QgsDiagramProperties::apply()
|
|||||||
ds.scaleBasedVisibility = mScaleVisibilityGroupBox->isChecked();
|
ds.scaleBasedVisibility = mScaleVisibilityGroupBox->isChecked();
|
||||||
|
|
||||||
// Diagram angle offset (pie)
|
// Diagram angle offset (pie)
|
||||||
ds.angleOffset = mAngleOffsetComboBox->currentData().toInt();
|
ds.rotationOffset = mAngleOffsetComboBox->currentData().toInt();
|
||||||
|
|
||||||
// Diagram orientation (histogram)
|
// Diagram orientation (histogram)
|
||||||
ds.diagramOrientation = static_cast<QgsDiagramSettings::DiagramOrientation>( mOrientationButtonGroup->checkedButton()->property( "direction" ).toInt() );
|
ds.diagramOrientation = static_cast<QgsDiagramSettings::DiagramOrientation>( mOrientationButtonGroup->checkedButton()->property( "direction" ).toInt() );
|
||||||
|
@ -138,7 +138,7 @@ void QgsPieDiagram::renderDiagram( const QgsFeature &feature, QgsRenderContext &
|
|||||||
}
|
}
|
||||||
else
|
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;
|
totalAngle += currentAngle;
|
||||||
}
|
}
|
||||||
|
@ -255,7 +255,10 @@ void QgsDiagramSettings::readXml( const QDomElement &elem )
|
|||||||
|
|
||||||
barWidth = elem.attribute( QStringLiteral( "barWidth" ) ).toDouble();
|
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();
|
minimumSize = elem.attribute( QStringLiteral( "minimumSize" ) ).toDouble();
|
||||||
|
|
||||||
@ -374,7 +377,7 @@ void QgsDiagramSettings::writeXml( QDomElement &rendererElem, QDomDocument &doc
|
|||||||
|
|
||||||
categoryElem.setAttribute( QStringLiteral( "barWidth" ), QString::number( barWidth ) );
|
categoryElem.setAttribute( QStringLiteral( "barWidth" ), QString::number( barWidth ) );
|
||||||
categoryElem.setAttribute( QStringLiteral( "minimumSize" ), QString::number( minimumSize ) );
|
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() );
|
int nCats = qMin( categoryColors.size(), categoryAttributes.size() );
|
||||||
for ( int i = 0; i < nCats; ++i )
|
for ( int i = 0; i < nCats; ++i )
|
||||||
@ -447,8 +450,8 @@ void QgsDiagramRenderer::renderDiagram( const QgsFeature &feature, QgsRenderCont
|
|||||||
s.penColor = properties.valueAsColor( QgsDiagramLayerSettings::StrokeColor, c.expressionContext(), s.penColor );
|
s.penColor = properties.valueAsColor( QgsDiagramLayerSettings::StrokeColor, c.expressionContext(), s.penColor );
|
||||||
c.expressionContext().setOriginalValueVariable( s.penWidth );
|
c.expressionContext().setOriginalValueVariable( s.penWidth );
|
||||||
s.penWidth = properties.valueAsDouble( QgsDiagramLayerSettings::StrokeWidth, c.expressionContext(), s.penWidth );
|
s.penWidth = properties.valueAsDouble( QgsDiagramLayerSettings::StrokeWidth, c.expressionContext(), s.penWidth );
|
||||||
c.expressionContext().setOriginalValueVariable( s.angleOffset / 16.0 );
|
c.expressionContext().setOriginalValueVariable( s.rotationOffset );
|
||||||
s.angleOffset = 16.0 * properties.valueAsDouble( QgsDiagramLayerSettings::StartAngle, c.expressionContext(), s.angleOffset / 16.0 );
|
s.rotationOffset = properties.valueAsDouble( QgsDiagramLayerSettings::StartAngle, c.expressionContext(), s.rotationOffset );
|
||||||
}
|
}
|
||||||
|
|
||||||
mDiagram->renderDiagram( feature, c, s, pos );
|
mDiagram->renderDiagram( feature, c, s, pos );
|
||||||
|
@ -374,7 +374,7 @@ class CORE_EXPORT QgsDiagramSettings
|
|||||||
, barWidth( 5.0 )
|
, barWidth( 5.0 )
|
||||||
, opacity( 1.0 )
|
, opacity( 1.0 )
|
||||||
, scaleByArea( true )
|
, scaleByArea( true )
|
||||||
, angleOffset( 90 * 16 ) //top
|
, rotationOffset( 270 ) //top
|
||||||
, scaleBasedVisibility( false )
|
, scaleBasedVisibility( false )
|
||||||
, minScaleDenominator( -1 )
|
, minScaleDenominator( -1 )
|
||||||
, maxScaleDenominator( -1 )
|
, maxScaleDenominator( -1 )
|
||||||
@ -418,7 +418,12 @@ class CORE_EXPORT QgsDiagramSettings
|
|||||||
double opacity;
|
double opacity;
|
||||||
|
|
||||||
bool scaleByArea;
|
bool scaleByArea;
|
||||||
int angleOffset;
|
|
||||||
|
/**
|
||||||
|
* Rotation offset, in degrees clockwise from horizontal.
|
||||||
|
* \since QGIS 3.0
|
||||||
|
*/
|
||||||
|
double rotationOffset;
|
||||||
|
|
||||||
bool scaleBasedVisibility;
|
bool scaleBasedVisibility;
|
||||||
//scale range (-1 if no lower / upper bound )
|
//scale range (-1 if no lower / upper bound )
|
||||||
|
@ -106,7 +106,8 @@ double QgsMapSettings::rotation() const
|
|||||||
|
|
||||||
void QgsMapSettings::setRotation( double degrees )
|
void QgsMapSettings::setRotation( double degrees )
|
||||||
{
|
{
|
||||||
if ( qgsDoubleNear( mRotation, degrees ) ) return;
|
if ( qgsDoubleNear( mRotation, degrees ) )
|
||||||
|
return;
|
||||||
|
|
||||||
mRotation = degrees;
|
mRotation = degrees;
|
||||||
|
|
||||||
|
@ -76,14 +76,19 @@ class CORE_EXPORT QgsMapSettings
|
|||||||
//! Set the size of the resulting map image
|
//! Set the size of the resulting map image
|
||||||
void setOutputSize( QSize size );
|
void setOutputSize( QSize size );
|
||||||
|
|
||||||
//! Return the rotation of the resulting map image
|
/**
|
||||||
//! Units are clockwise degrees
|
* Returns the rotation of the resulting map image, in degrees clockwise.
|
||||||
//! \since QGIS 2.8
|
* \since QGIS 2.8
|
||||||
|
* \see setRotation()
|
||||||
|
*/
|
||||||
double rotation() const;
|
double rotation() const;
|
||||||
//! Set the rotation of the resulting map image
|
|
||||||
//! Units are clockwise degrees
|
/**
|
||||||
//! \since QGIS 2.8
|
* Sets the \a rotation of the resulting map image, in degrees clockwise.
|
||||||
void setRotation( double degrees );
|
* \since QGIS 2.8
|
||||||
|
* \see rotation()
|
||||||
|
*/
|
||||||
|
void setRotation( double rotation );
|
||||||
|
|
||||||
//! Return DPI used for conversion between real world units (e.g. mm) and pixels
|
//! Return DPI used for conversion between real world units (e.g. mm) and pixels
|
||||||
//! Default value is 96
|
//! Default value is 96
|
||||||
|
@ -153,7 +153,7 @@ class TestQgsDiagram : public QObject
|
|||||||
ds.scaleByArea = true;
|
ds.scaleByArea = true;
|
||||||
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
||||||
ds.size = QSizeF( 5, 5 );
|
ds.size = QSizeF( 5, 5 );
|
||||||
ds.angleOffset = 0;
|
ds.rotationOffset = 270;
|
||||||
|
|
||||||
QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
|
QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
|
||||||
dr->setLowerValue( 0.0 );
|
dr->setLowerValue( 0.0 );
|
||||||
@ -190,7 +190,7 @@ class TestQgsDiagram : public QObject
|
|||||||
ds.scaleByArea = true;
|
ds.scaleByArea = true;
|
||||||
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
||||||
ds.size = QSizeF( 5, 5 );
|
ds.size = QSizeF( 5, 5 );
|
||||||
ds.angleOffset = 0;
|
ds.rotationOffset = 270;
|
||||||
|
|
||||||
QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
|
QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
|
||||||
dr->setLowerValue( 0.0 );
|
dr->setLowerValue( 0.0 );
|
||||||
@ -232,7 +232,7 @@ class TestQgsDiagram : public QObject
|
|||||||
ds.scaleByArea = true;
|
ds.scaleByArea = true;
|
||||||
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
||||||
ds.size = QSizeF( 15, 15 );
|
ds.size = QSizeF( 15, 15 );
|
||||||
ds.angleOffset = 0;
|
ds.rotationOffset = 270;
|
||||||
|
|
||||||
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
||||||
dr->setDiagram( new QgsPieDiagram() );
|
dr->setDiagram( new QgsPieDiagram() );
|
||||||
@ -269,7 +269,7 @@ class TestQgsDiagram : public QObject
|
|||||||
ds.scaleByArea = true;
|
ds.scaleByArea = true;
|
||||||
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
||||||
ds.size = QSizeF( 15, 15 );
|
ds.size = QSizeF( 15, 15 );
|
||||||
ds.angleOffset = 0;
|
ds.rotationOffset = 270;
|
||||||
|
|
||||||
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
||||||
dr->setDiagram( new QgsPieDiagram() );
|
dr->setDiagram( new QgsPieDiagram() );
|
||||||
@ -306,7 +306,7 @@ class TestQgsDiagram : public QObject
|
|||||||
ds.scaleByArea = true;
|
ds.scaleByArea = true;
|
||||||
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
||||||
ds.size = QSizeF( 15, 15 );
|
ds.size = QSizeF( 15, 15 );
|
||||||
ds.angleOffset = 0;
|
ds.rotationOffset = 270;
|
||||||
|
|
||||||
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
||||||
dr->setDiagram( new QgsPieDiagram() );
|
dr->setDiagram( new QgsPieDiagram() );
|
||||||
@ -342,7 +342,7 @@ class TestQgsDiagram : public QObject
|
|||||||
ds.scaleByArea = true;
|
ds.scaleByArea = true;
|
||||||
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
||||||
ds.size = QSizeF( 15, 15 );
|
ds.size = QSizeF( 15, 15 );
|
||||||
ds.angleOffset = 0;
|
ds.rotationOffset = 270;
|
||||||
|
|
||||||
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
||||||
dr->setDiagram( new QgsPieDiagram() );
|
dr->setDiagram( new QgsPieDiagram() );
|
||||||
@ -378,7 +378,7 @@ class TestQgsDiagram : public QObject
|
|||||||
ds.scaleByArea = true;
|
ds.scaleByArea = true;
|
||||||
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
||||||
ds.size = QSizeF( 15, 15 );
|
ds.size = QSizeF( 15, 15 );
|
||||||
ds.angleOffset = 0;
|
ds.rotationOffset = 270;
|
||||||
|
|
||||||
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
||||||
dr->setDiagram( new QgsPieDiagram() );
|
dr->setDiagram( new QgsPieDiagram() );
|
||||||
@ -414,7 +414,7 @@ class TestQgsDiagram : public QObject
|
|||||||
ds.scaleByArea = true;
|
ds.scaleByArea = true;
|
||||||
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
||||||
ds.size = QSizeF( 50, 50 );
|
ds.size = QSizeF( 50, 50 );
|
||||||
ds.angleOffset = 0;
|
ds.rotationOffset = 270;
|
||||||
|
|
||||||
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
||||||
dr->setDiagram( new QgsPieDiagram() );
|
dr->setDiagram( new QgsPieDiagram() );
|
||||||
@ -448,7 +448,7 @@ class TestQgsDiagram : public QObject
|
|||||||
ds.scaleByArea = true;
|
ds.scaleByArea = true;
|
||||||
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
||||||
ds.size = QSizeF( 50, 50 );
|
ds.size = QSizeF( 50, 50 );
|
||||||
ds.angleOffset = 0;
|
ds.rotationOffset = 270;
|
||||||
|
|
||||||
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
||||||
dr->setDiagram( new QgsPieDiagram() );
|
dr->setDiagram( new QgsPieDiagram() );
|
||||||
@ -484,7 +484,7 @@ class TestQgsDiagram : public QObject
|
|||||||
ds.scaleByArea = true;
|
ds.scaleByArea = true;
|
||||||
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
||||||
ds.size = QSizeF( 50, 50 );
|
ds.size = QSizeF( 50, 50 );
|
||||||
ds.angleOffset = 0;
|
ds.rotationOffset = 270;
|
||||||
|
|
||||||
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
||||||
dr->setDiagram( new QgsPieDiagram() );
|
dr->setDiagram( new QgsPieDiagram() );
|
||||||
@ -525,7 +525,7 @@ class TestQgsDiagram : public QObject
|
|||||||
ds.scaleByArea = true;
|
ds.scaleByArea = true;
|
||||||
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
ds.sizeType = QgsUnitTypes::RenderMillimeters;
|
||||||
ds.size = QSizeF( 15, 15 );
|
ds.size = QSizeF( 15, 15 );
|
||||||
ds.angleOffset = 0;
|
ds.rotationOffset = 270;
|
||||||
|
|
||||||
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
|
||||||
dr->setDiagram( new QgsTextDiagram() );
|
dr->setDiagram( new QgsTextDiagram() );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user