QGIS API Documentation  3.17.0-Master (df2c9ff931)
qgs25drendererwidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgs25drendererwidget.cpp - Qgs25DRendererWidget
3 
4  ---------------------
5  begin : 14.1.2016
6  copyright : (C) 2016 by mku
7  email : [your-email-here]
8  ***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 #include "qgs25drendererwidget.h"
17 #include "qgs25drenderer.h"
18 #include "qgsvectorlayer.h"
21 
23  : QgsRendererWidget( layer, style )
24 
25 {
26  if ( !layer )
27  return;
28 
29  // the renderer only applies to point vector layers
31  {
32  //setup blank dialog
33  QGridLayout *layout = new QGridLayout( this );
34  QLabel *label = new QLabel( tr( "The 2.5D renderer only can be used with polygon layers. \n"
35  "'%1' is not a polygon layer and cannot be rendered in 2.5D." )
36  .arg( layer->name() ), this );
37  layout->addWidget( label );
38  return;
39  }
40 
41  setupUi( this );
42  this->layout()->setContentsMargins( 0, 0, 0, 0 );
43 
44  mAngleWidget->setClearValue( 0 );
45  mWallColorButton->setColorDialogTitle( tr( "Select Wall Color" ) );
46  mWallColorButton->setAllowOpacity( true );
47  mWallColorButton->setContext( QStringLiteral( "symbology" ) );
48  mRoofColorButton->setColorDialogTitle( tr( "Select Roof Color" ) );
49  mRoofColorButton->setAllowOpacity( true );
50  mRoofColorButton->setContext( QStringLiteral( "symbology" ) );
51  mShadowColorButton->setColorDialogTitle( tr( "Select Shadow Color" ) );
52  mShadowColorButton->setAllowOpacity( true );
53  mShadowColorButton->setContext( QStringLiteral( "symbology" ) );
54 
55  if ( renderer )
56  {
57  mRenderer = Qgs25DRenderer::convertFromRenderer( renderer );
58  }
59 
60  mHeightWidget->setLayer( layer );
61 
63  QVariant height = scope->variable( QStringLiteral( "qgis_25d_height" ) );
64  QVariant angle = scope->variable( QStringLiteral( "qgis_25d_angle" ) );
65  delete scope;
66 
67  mHeightWidget->setField( height.isNull() ? QStringLiteral( "10" ) : height.toString() );
68  mAngleWidget->setValue( angle.isNull() ? 70 : angle.toDouble() );
69  mAngleWidget->setClearValue( 70 );
70  mWallColorButton->setColor( mRenderer->wallColor() );
71  mRoofColorButton->setColor( mRenderer->roofColor() );
72  mShadowColorButton->setColor( mRenderer->shadowColor() );
73  mShadowEnabledWidget->setChecked( mRenderer->shadowEnabled() );
74  mShadowSizeWidget->setValue( mRenderer->shadowSpread() );
75  mShadowSizeWidget->setClearValue( 4 );
76  mWallExpositionShading->setChecked( mRenderer->wallShadingEnabled() );
77 
78  connect( mAngleWidget, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &Qgs25DRendererWidget::updateRenderer );
79  connect( mHeightWidget, static_cast < void ( QgsFieldExpressionWidget::* )( const QString & ) > ( &QgsFieldExpressionWidget::fieldChanged ), this, &Qgs25DRendererWidget::updateRenderer );
80  connect( mWallColorButton, &QgsColorButton::colorChanged, this, &Qgs25DRendererWidget::updateRenderer );
81  connect( mRoofColorButton, &QgsColorButton::colorChanged, this, &Qgs25DRendererWidget::updateRenderer );
82  connect( mShadowColorButton, &QgsColorButton::colorChanged, this, &Qgs25DRendererWidget::updateRenderer );
83  connect( mShadowEnabledWidget, &QGroupBox::toggled, this, &Qgs25DRendererWidget::updateRenderer );
84  connect( mShadowSizeWidget, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &Qgs25DRendererWidget::updateRenderer );
85  connect( mWallExpositionShading, &QAbstractButton::toggled, this, &Qgs25DRendererWidget::updateRenderer );
86 }
87 
89 {
90  return mRenderer;
91 }
92 
93 void Qgs25DRendererWidget::updateRenderer()
94 {
95  mRenderer->setRoofColor( mRoofColorButton->color() );
96  mRenderer->setWallColor( mWallColorButton->color() );
97  mRenderer->setShadowColor( mShadowColorButton->color() );
98  mRenderer->setShadowEnabled( mShadowEnabledWidget->isChecked() );
99  mRenderer->setShadowSpread( mShadowSizeWidget->value() );
100  mRenderer->setWallShadingEnabled( mWallExpositionShading->isChecked() );
101  emit widgetChanged();
102 }
103 
104 void Qgs25DRendererWidget::apply()
105 {
106  if ( mHeightWidget )
107  {
108  QgsExpressionContextUtils::setLayerVariable( mLayer, QStringLiteral( "qgis_25d_height" ), mHeightWidget->currentText() );
109  QgsExpressionContextUtils::setLayerVariable( mLayer, QStringLiteral( "qgis_25d_angle" ), mAngleWidget->value() );
110 
111  emit layerVariablesChanged();
112  }
113 }
114 
116 {
117  return new Qgs25DRendererWidget( layer, style, renderer );
118 }
The QgsFieldExpressionWidget class reates a widget to choose fields and edit expressions It contains ...
QColor wallColor() const
Gets the wall color.
Base class for renderer settings widgets.
QgsVectorLayer * mLayer
Q_INVOKABLE QgsWkbTypes::GeometryType geometryType() const
Returns point, line or polygon.
static QgsRendererWidget * create(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer)
Static creation method.
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)
Definition: MathUtils.cpp:786
bool shadowEnabled() const
Is the shadow enabled.
void setShadowSpread(double shadowSpread)
Set the shadow&#39;s spread distance in map units.
QColor shadowColor() const
Gets the shadow&#39;s color.
static Qgs25DRenderer * convertFromRenderer(QgsFeatureRenderer *renderer)
Try to convert from an existing renderer.
QVariant variable(const QString &name) const
Retrieves a variable&#39;s value from the scope.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void widgetChanged()
Emitted when the widget state changes.
static void setLayerVariable(QgsMapLayer *layer, const QString &name, const QVariant &value)
Sets a layer context variable.
void fieldChanged(const QString &fieldName)
Emitted when the currently selected field changes.
void colorChanged(const QColor &color)
Emitted whenever a new color is set for the button.
QgsFeatureRenderer * renderer() override
Returns pointer to the renderer (no transfer of ownership)
void setRoofColor(const QColor &roofColor)
Set the roof color.
bool wallShadingEnabled() const
Gets wall shading enabled.
void setShadowEnabled(bool value)
Enable or disable the shadow.
void setWallShadingEnabled(bool enabled)
Set wall shading enabled.
QColor roofColor() const
Gets the roof color.
QString name
Definition: qgsmaplayer.h:88
double shadowSpread() const
Gets the shadow&#39;s spread distance in map units.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
Represents a vector layer which manages a vector based data sets.
void setShadowColor(const QColor &shadowColor)
Set the shadow&#39;s color.
void layerVariablesChanged()
Emitted when expression context variables on the associated vector layers have been changed...
Qgs25DRendererWidget(QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer)
Constructor.
void setWallColor(const QColor &wallColor)
Set the wall color.