QGIS API Documentation 3.27.0-Master (0a97e3138f)
qgshillshaderendererwidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgshillshaderendererwidget.cpp
3 ---------------------------------
4 begin : May 2016
5 copyright : (C) 2016 by Nathan Woodrow
6 email : woodrow dot nathan at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18
20#include "qgsrasterlayer.h"
24
26 : QgsRasterRendererWidget( layer, extent )
27{
28 setupUi( this );
29
30 mLightAngle->setMaximum( 90 );
31 mLightAzimuth->setMaximum( 360.00 );
32
33 mLightAngle->setValue( 45.00 );
34 mLightAngle->setClearValue( 45.0 );
35 mLightAzimuth->setValue( 315.00 );
36 mLightAzimuth->setClearValue( 315.00 );
37
38 // Update the dial correctly
39 mLightAzimuth_updated( 315.00 );
40 mZFactor->setValue( 1 );
41 mZFactor->setClearValue( 1 );
42
43 mMultiDirection->setChecked( false );
44 mBandsCombo->setLayer( mRasterLayer );
45
46 setFromRenderer( layer->renderer() );
47
48 connect( mLightAngle, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsRasterRendererWidget::widgetChanged );
49 connect( mLightAzimuth, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsHillshadeRendererWidget::mLightAzimuth_updated );
50 connect( mLightAzimuthDial, &QAbstractSlider::valueChanged, this, &QgsHillshadeRendererWidget::mLightAzimuthDial_updated );
51 connect( mZFactor, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsRasterRendererWidget::widgetChanged );
52 connect( mMultiDirection, &QAbstractButton::toggled, this, &QgsRasterRendererWidget::widgetChanged );
54}
55
57{
58 if ( !mRasterLayer )
59 {
60 return nullptr;
61 }
62
64 if ( !provider )
65 {
66 return nullptr;
67 }
68
69 const int band = mBandsCombo->currentBand();
70 QgsHillshadeRenderer *renderer = new QgsHillshadeRenderer( provider, band, mLightAzimuth->value(), mLightAngle->value() );
71 const double value = mZFactor->value();
72 renderer->setZFactor( value );
73 renderer->setMultiDirectional( mMultiDirection->checkState() );
74 return renderer;
75}
76
78{
79 const QgsHillshadeRenderer *r = dynamic_cast<const QgsHillshadeRenderer *>( renderer );
80 if ( r )
81 {
82 mBandsCombo->setBand( r->band() );
83 mLightAngle->setValue( r->altitude() );
84 mLightAzimuth->setValue( r->azimuth() );
85 mZFactor->setValue( r->zFactor() );
86 mMultiDirection->setChecked( r->multiDirectional() );
87 }
88}
89
91{
92 mLightAngle->setValue( altitude );
93}
94
96{
97 mLightAzimuth->setValue( azimuth );
98}
99
101{
102 mZFactor->setValue( zfactor );
103}
104
106{
107 mMultiDirection->setChecked( isMultiDirectional );
108}
109
110void QgsHillshadeRendererWidget::mLightAzimuth_updated( double value )
111{
112 int newvalue = static_cast<int>( value ) - 180;
113 if ( newvalue < 0 )
114 newvalue += 360;
115 whileBlocking( mLightAzimuthDial )->setValue( newvalue );
116 emit widgetChanged();
117}
118
119void QgsHillshadeRendererWidget::mLightAzimuthDial_updated( int value )
120{
121 int newvalue = static_cast<int>( value ) + 180;
122 if ( newvalue > 360 )
123 newvalue -= 360;
124 whileBlocking( mLightAzimuth )->setValue( newvalue );
125 emit widgetChanged();
126}
127
129{
130 return mLightAzimuth->value();
131}
132
134{
135 return mLightAngle->value();
136}
137
139{
140 return mZFactor->value();
141}
142
144{
145 return mMultiDirection->isChecked();
146}
QgsRasterRenderer * renderer() override
Creates a new renderer, using the properties defined in the widget.
double zFactor() const
Returns the Z scaling factor.
void setAzimuth(double azimuth)
Set the azimuth of the light source.
QgsHillshadeRendererWidget(QgsRasterLayer *layer, const QgsRectangle &extent=QgsRectangle())
Renderer widget for the hill shade renderer.
bool multiDirectional() const
Returns true if the renderer should use the multi-directional hillshade algorithm.
void setAltitude(double altitude)
Set the altitude of the light source.
double azimuth() const
Returns the direction of the light over the raster between 0-360.
void setFromRenderer(const QgsRasterRenderer *renderer)
Set the widget state from the given renderer.
void setZFactor(double zfactor)
Set the Z scaling factor of the result image.
double altitude() const
Returns the angle of the light source over the raster.
void setMultiDirectional(bool isMultiDirectional)
Sets whether to render using a multi-directional hillshade algorithm.
A renderer for generating live hillshade models.
bool multiDirectional() const
Returns true if the renderer is using multi-directional hillshading.
double azimuth() const
Returns the direction of the light over the raster between 0-360.
int band() const
Returns the band used by the renderer.
void setBand(int bandNo)
Sets the band used by the renderer.
double altitude() const
Returns the angle of the light source over the raster.
double zFactor() const
Returns the Z scaling factor.
void bandChanged(int band)
Emitted when the currently selected band changes.
Base class for raster data providers.
Represents a raster layer.
QgsRasterRenderer * renderer() const
Returns the raster's renderer.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
Abstract base class for widgets which configure a QgsRasterRenderer.
void widgetChanged()
Emitted when something on the widget has changed.
Raster renderer pipe that applies colors to a raster.
A rectangle specified with double values.
Definition: qgsrectangle.h:42
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
Definition: qgis.h:2330