Review fixes, sip, doc fixes, icons, style panel fix

This commit is contained in:
Martin Dobias 2019-01-18 09:32:53 +01:00
parent f069342b35
commit 9875821b04
11 changed files with 344 additions and 44 deletions

View File

@ -1,6 +1,7 @@
// Include auto-generated SIP files
%Include auto_generated/qgs3dtypes.sip
%Include auto_generated/qgsphongmaterialsettings.sip
%Include auto_generated/qgsrulebased3drenderer.sip
%Include auto_generated/qgsvectorlayer3drenderer.sip
%Include auto_generated/symbols/qgsabstract3dsymbol.sip
%Include auto_generated/symbols/qgsline3dsymbol.sip

View File

@ -0,0 +1,280 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/3d/qgsrulebased3drenderer.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/
class QgsRuleBased3DRendererMetadata : Qgs3DRendererAbstractMetadata
{
%Docstring
Metadata for rule-based 3D renderer to allow creation of its instances from XML
.. warning::
This is not considered stable API, and may change in future QGIS releases. It is
exposed to the Python bindings as a tech preview only.
.. versionadded:: 3.6
%End
%TypeHeaderCode
#include "qgsrulebased3drenderer.h"
%End
public:
QgsRuleBased3DRendererMetadata();
virtual QgsAbstract3DRenderer *createRenderer( QDomElement &elem, const QgsReadWriteContext &context ) /Factory/;
%Docstring
Creates an instance of a 3D renderer based on a DOM element with renderer configuration
%End
};
class QgsRuleBased3DRenderer : QgsAbstract3DRenderer
{
%Docstring
Rule-based 3D renderer.
Similar to rule-based 2D renderer and rule-based labeling, it allows specification of rules for 3D symbols.
.. warning::
This is not considered stable API, and may change in future QGIS releases. It is
exposed to the Python bindings as a tech preview only.
.. versionadded:: 3.6
%End
%TypeHeaderCode
#include "qgsrulebased3drenderer.h"
%End
public:
typedef QList<QgsRuleBased3DRenderer::Rule *> RuleList;
typedef QMap<const QgsRuleBased3DRenderer::Rule *, QgsFeature3DHandler *> RuleToHandlerMap;
class Rule
{
%Docstring
.. versionadded:: 3.6
%End
%TypeHeaderCode
#include "qgsrulebased3drenderer.h"
%End
public:
Rule( QgsAbstract3DSymbol *symbol /Transfer/, const QString &filterExp = QString(), const QString &description = QString(), bool elseRule = false );
%Docstring
takes ownership of symbol, symbol may be None
%End
~Rule();
enum RegisterResult
{
Filtered,
Inactive,
Registered
};
QgsAbstract3DSymbol *symbol() const;
%Docstring
Gets the labeling settings. May return a null pointer.
%End
QString filterExpression() const;
%Docstring
A filter that will check if this rule applies
:return: An expression
%End
QString description() const;
%Docstring
A human readable description for this rule
:return: Description
%End
bool active() const;
%Docstring
Returns if this rule is active
:return: True if the rule is active
%End
bool isElse() const;
%Docstring
Check if this rule is an ELSE rule
:return: True if this rule is an else rule
%End
QString ruleKey() const;
%Docstring
Unique rule identifier (for identification of rule within labeling, used as provider ID)
%End
void setSymbol( QgsAbstract3DSymbol *symbol /Transfer/ );
%Docstring
Sets new symbol (or NULL). Deletes old symbol if any.
%End
void setFilterExpression( const QString &filterExp );
%Docstring
Set the expression used to check if a given feature shall be rendered with this rule
:param filterExp: An expression
%End
void setDescription( const QString &description );
%Docstring
Set a human readable description for this rule
:param description: Description
%End
void setActive( bool state );
%Docstring
Sets if this rule is active
:param state: Determines if the rule should be activated or deactivated
%End
void setIsElse( bool iselse );
%Docstring
Sets if this rule is an ELSE rule
:param iselse: If true, this rule is an ELSE rule
%End
void setRuleKey( const QString &key );
%Docstring
Override the assigned rule key (should be used just internally by rule-based renderer)
%End
const QgsRuleBased3DRenderer::RuleList &children() const;
%Docstring
Returns all children rules of this rule
:return: A list of rules
%End
QgsRuleBased3DRenderer::RuleList descendants() const;
%Docstring
Returns all children, grand-children, grand-grand-children, grand-gra... you get it
:return: A list of descendant rules
%End
QgsRuleBased3DRenderer::Rule *parent();
%Docstring
The parent rule
:return: Parent rule
%End
void appendChild( QgsRuleBased3DRenderer::Rule *rule /Transfer/ );
%Docstring
add child rule, take ownership, sets this as parent
%End
void insertChild( int i, QgsRuleBased3DRenderer::Rule *rule /Transfer/ );
%Docstring
add child rule, take ownership, sets this as parent
%End
void removeChildAt( int i );
%Docstring
delete child rule
%End
const QgsRuleBased3DRenderer::Rule *findRuleByKey( const QString &key ) const;
%Docstring
Try to find a rule given its unique key
%End
QgsRuleBased3DRenderer::Rule *clone() const /Factory/;
%Docstring
clone this rule, return new instance
%End
static QgsRuleBased3DRenderer::Rule *create( const QDomElement &ruleElem, const QgsReadWriteContext &context ) /Factory/;
%Docstring
Create a rule from an XML definition
:param ruleElem: The XML rule element
:param context: reading context
:return: A new rule
%End
QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const;
%Docstring
store labeling info to XML element
%End
private:
Rule( const QgsRuleBased3DRenderer::Rule &rh );
};
QgsRuleBased3DRenderer( QgsRuleBased3DRenderer::Rule *root /Transfer/ );
%Docstring
Construct renderer with the given root rule (takes ownership)
%End
~QgsRuleBased3DRenderer();
void setLayer( QgsVectorLayer *layer );
%Docstring
Sets vector layer associated with the renderer
%End
QgsVectorLayer *layer() const;
%Docstring
Returns vector layer associated with the renderer
%End
QgsRuleBased3DRenderer::Rule *rootRule();
%Docstring
Returns pointer to the root rule
%End
virtual QString type() const;
virtual QgsRuleBased3DRenderer *clone() const /Factory/;
virtual void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const;
virtual void readXml( const QDomElement &elem, const QgsReadWriteContext &context );
virtual void resolveReferences( const QgsProject &project );
};
/************************************************************************
* This file has been generated automatically from *
* *
* src/3d/qgsrulebased3drenderer.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/

View File

@ -378,18 +378,26 @@ QgsVector3D Qgs3DUtils::transformWorldCoordinates( const QgsVector3D &worldPoint
return mapToWorldCoordinates( mapPoint2, origin2 );
}
QgsAbstract3DSymbol *Qgs3DUtils::symbolForGeometryType( QgsWkbTypes::GeometryType geomType )
std::unique_ptr<QgsAbstract3DSymbol> Qgs3DUtils::symbolForGeometryType( QgsWkbTypes::GeometryType geomType )
{
switch ( geomType )
{
case QgsWkbTypes::PointGeometry:
return new QgsPoint3DSymbol;
return std::unique_ptr<QgsAbstract3DSymbol>( new QgsPoint3DSymbol );
case QgsWkbTypes::LineGeometry:
return new QgsLine3DSymbol;
return std::unique_ptr<QgsAbstract3DSymbol>( new QgsLine3DSymbol );
case QgsWkbTypes::PolygonGeometry:
return new QgsPolygon3DSymbol;
return std::unique_ptr<QgsAbstract3DSymbol>( new QgsPolygon3DSymbol );
default:
return nullptr;
}
}
QgsExpressionContext Qgs3DUtils::globalProjectLayerExpressionContext( QgsVectorLayer *layer )
{
QgsExpressionContext exprContext;
exprContext << QgsExpressionContextUtils::globalScope()
<< QgsExpressionContextUtils::projectScope( QgsProject::instance() )
<< QgsExpressionContextUtils::layerScope( layer );
return exprContext;
}

View File

@ -29,6 +29,7 @@ class Qgs3DMapScene;
#include "qgs3dtypes.h"
#include "qgsaabb.h"
#include <memory>
#ifndef SIP_RUN
@ -101,7 +102,11 @@ class _3D_EXPORT Qgs3DUtils
static QgsVector3D transformWorldCoordinates( const QgsVector3D &worldPoint1, const QgsVector3D &origin1, const QgsCoordinateReferenceSystem &crs1, const QgsVector3D &origin2, const QgsCoordinateReferenceSystem &crs2,
const QgsCoordinateTransformContext &context );
static QgsAbstract3DSymbol *symbolForGeometryType( QgsWkbTypes::GeometryType geomType );
//! Returns a new 3D symbol based on given geometry type (or null pointer if geometry type is not supported)
static std::unique_ptr<QgsAbstract3DSymbol> symbolForGeometryType( QgsWkbTypes::GeometryType geomType );
//! Returns expression context for use in preparation of 3D data of a layer
static QgsExpressionContext globalProjectLayerExpressionContext( QgsVectorLayer *layer );
};
#endif

View File

@ -20,6 +20,7 @@
#include "qgsvectorlayer.h"
#include "qgs3dmapsettings.h"
#include "qgs3dutils.h"
/// @cond PRIVATE
@ -31,9 +32,7 @@ namespace Qgs3DSymbolImpl
{
Qgs3DRenderContext context( map );
QgsExpressionContext exprContext;
exprContext << QgsExpressionContextUtils::globalScope()
<< QgsExpressionContextUtils::projectScope( QgsProject::instance() );
QgsExpressionContext exprContext( Qgs3DUtils::globalProjectLayerExpressionContext( layer ) );
exprContext.setFields( layer->fields() );
context.setExpressionContext( exprContext );

View File

@ -19,6 +19,7 @@
#include "qgsxmlutils.h"
#include "qgs3dmapsettings.h"
#include "qgs3dutils.h"
#include "qgsline3dsymbol.h"
#include "qgspoint3dsymbol.h"
#include "qgspolygon3dsymbol.h"
@ -415,7 +416,10 @@ Qt3DCore::QEntity *QgsRuleBased3DRenderer::createEntity( const Qgs3DMapSettings
return nullptr;
Qgs3DRenderContext context( map );
// TODO: add expr. context
QgsExpressionContext exprContext( Qgs3DUtils::globalProjectLayerExpressionContext( vl ) );
exprContext.setFields( vl->fields() );
context.setExpressionContext( exprContext );
RuleToHandlerMap handlers;
mRootRule->createHandlers( vl, handlers );
@ -431,7 +435,7 @@ Qt3DCore::QEntity *QgsRuleBased3DRenderer::createEntity( const Qgs3DMapSettings
QgsFeatureIterator fi = vl->getFeatures( req );
while ( fi.nextFeature( f ) )
{
// TODO: set feature in expr context?
context.expressionContext().setFeature( f );
mRootRule->registerFeature( f, context, handlers );
}

View File

@ -28,6 +28,15 @@ class Qgs3DRenderContext;
class QgsFeature3DHandler;
/**
* \ingroup 3d
* Metadata for rule-based 3D renderer to allow creation of its instances from XML
*
* \warning This is not considered stable API, and may change in future QGIS releases. It is
* exposed to the Python bindings as a tech preview only.
*
* \since QGIS 3.6
*/
class _3D_EXPORT QgsRuleBased3DRendererMetadata : public Qgs3DRendererAbstractMetadata
{
public:
@ -43,6 +52,10 @@ class _3D_EXPORT QgsRuleBased3DRendererMetadata : public Qgs3DRendererAbstractMe
* Rule-based 3D renderer.
*
* Similar to rule-based 2D renderer and rule-based labeling, it allows specification of rules for 3D symbols.
*
* \warning This is not considered stable API, and may change in future QGIS releases. It is
* exposed to the Python bindings as a tech preview only.
*
* \since QGIS 3.6
*/
class _3D_EXPORT QgsRuleBased3DRenderer : public QgsAbstract3DRenderer
@ -279,6 +292,7 @@ class _3D_EXPORT QgsRuleBased3DRenderer : public QgsAbstract3DRenderer
};
//! Construct renderer with the given root rule (takes ownership)
QgsRuleBased3DRenderer( QgsRuleBased3DRenderer::Rule *root SIP_TRANSFER );
~QgsRuleBased3DRenderer() override;
@ -287,7 +301,9 @@ class _3D_EXPORT QgsRuleBased3DRenderer : public QgsAbstract3DRenderer
//! Returns vector layer associated with the renderer
QgsVectorLayer *layer() const;
//! Returns pointer to the root rule
QgsRuleBased3DRenderer::Rule *rootRule() { return mRootRule; }
//! Returns pointer to the root rule
const Rule *rootRule() const SIP_SKIP { return mRootRule; }
QString type() const override { return "rulebased"; }

View File

@ -26,18 +26,6 @@
#include <QMessageBox>
static QList<QgsExpressionContextScope *> _globalProjectLayerScopes( const QgsMapLayer *layer )
{
QList<QgsExpressionContextScope *> scopes;
scopes << QgsExpressionContextUtils::globalScope()
<< QgsExpressionContextUtils::projectScope( QgsProject::instance() )
<< QgsExpressionContextUtils::layerScope( layer );
return scopes;
}
// --------
QgsRuleBased3DRendererWidget::QgsRuleBased3DRendererWidget( QWidget *parent )
: QgsPanelWidget( parent )
{
@ -101,7 +89,7 @@ void QgsRuleBased3DRendererWidget::setLayer( QgsVectorLayer *layer )
void QgsRuleBased3DRendererWidget::addRule()
{
QgsRuleBased3DRenderer::Rule *newrule = new QgsRuleBased3DRenderer::Rule( Qgs3DUtils::symbolForGeometryType( mLayer->geometryType() ) );
QgsRuleBased3DRenderer::Rule *newrule = new QgsRuleBased3DRenderer::Rule( Qgs3DUtils::symbolForGeometryType( mLayer->geometryType() ).release() );
QgsRuleBased3DRenderer::Rule *current = currentRule();
if ( current )
@ -543,7 +531,6 @@ Qgs3DRendererRulePropsWidget::Qgs3DRendererRulePropsWidget( QgsRuleBased3DRender
: QgsPanelWidget( parent )
, mRule( rule )
, mLayer( layer )
, mSymbol( nullptr )
{
setupUi( this );
@ -557,7 +544,7 @@ Qgs3DRendererRulePropsWidget::Qgs3DRendererRulePropsWidget( QgsRuleBased3DRender
if ( mRule->symbol() )
{
groupSymbol->setChecked( true );
mSymbol = mRule->symbol()->clone(); // use a clone!
mSymbol.reset( mRule->symbol()->clone() ); // use a clone!
}
else
{
@ -566,7 +553,7 @@ Qgs3DRendererRulePropsWidget::Qgs3DRendererRulePropsWidget( QgsRuleBased3DRender
}
mSymbolWidget = new QgsSymbol3DWidget( this );
mSymbolWidget->setSymbol( mSymbol, layer );
mSymbolWidget->setSymbol( mSymbol.get(), layer );
QVBoxLayout *l = new QVBoxLayout;
l->addWidget( mSymbolWidget );
groupSymbol->setLayout( l );
@ -581,16 +568,7 @@ Qgs3DRendererRulePropsWidget::Qgs3DRendererRulePropsWidget( QgsRuleBased3DRender
connect( mElseRadio, &QRadioButton::toggled, this, [ = ]( bool toggled ) { if ( toggled ) editFilter->setText( QStringLiteral( "ELSE" ) );} );
}
Qgs3DRendererRulePropsWidget::~Qgs3DRendererRulePropsWidget()
{
delete mSymbol;
}
void Qgs3DRendererRulePropsWidget::setDockMode( bool dockMode )
{
QgsPanelWidget::setDockMode( dockMode );
// TODO mLabelingGui->setDockMode( dockMode );
}
Qgs3DRendererRulePropsWidget::~Qgs3DRendererRulePropsWidget() = default;
void Qgs3DRendererRulePropsWidget::testFilter()
{
@ -604,7 +582,7 @@ void Qgs3DRendererRulePropsWidget::testFilter()
return;
}
QgsExpressionContext context( _globalProjectLayerScopes( mLayer ) );
QgsExpressionContext context( Qgs3DUtils::globalProjectLayerExpressionContext( mLayer ) );
if ( !filter.prepare( &context ) )
{
@ -637,7 +615,7 @@ void Qgs3DRendererRulePropsWidget::testFilter()
void Qgs3DRendererRulePropsWidget::buildExpression()
{
QgsExpressionContext context( _globalProjectLayerScopes( mLayer ) );
QgsExpressionContext context( Qgs3DUtils::globalProjectLayerExpressionContext( mLayer ) );
QgsExpressionBuilderDialog dlg( mLayer, editFilter->text(), this, QStringLiteral( "generic" ), context );

View File

@ -148,8 +148,6 @@ class Qgs3DRendererRulePropsWidget : public QgsPanelWidget, private Ui::Qgs3DRen
QgsRuleBased3DRenderer::Rule *rule() { return mRule; }
void setDockMode( bool dockMode ) override;
public slots:
void testFilter();
void buildExpression();
@ -164,7 +162,7 @@ class Qgs3DRendererRulePropsWidget : public QgsPanelWidget, private Ui::Qgs3DRen
QgsVectorLayer *mLayer = nullptr;
QgsSymbol3DWidget *mSymbolWidget = nullptr;
QgsAbstract3DSymbol *mSymbol; // a clone of original symbol
std::unique_ptr<QgsAbstract3DSymbol> mSymbol; // a clone of original symbol
};

View File

@ -72,9 +72,9 @@ QgsVectorLayer3DRendererWidget::QgsVectorLayer3DRendererWidget( QgsVectorLayer *
QVBoxLayout *layout = new QVBoxLayout( this );
cboRendererType = new QComboBox( this );
cboRendererType->addItem( tr( "No renderer" ) );
cboRendererType->addItem( tr( "Single symbol renderer" ) );
cboRendererType->addItem( tr( "Rule-based renderer" ) );
cboRendererType->addItem( QgsApplication::getThemeIcon( QStringLiteral( "rendererNullSymbol.svg" ) ), tr( "No symbols" ) );
cboRendererType->addItem( QgsApplication::getThemeIcon( QStringLiteral( "rendererSingleSymbol.svg" ) ), tr( "Single symbol" ) );
cboRendererType->addItem( QgsApplication::getThemeIcon( QStringLiteral( "rendererRuleBasedSymbol.svg" ) ), tr( "Rule-based" ) );
widgetRendererStack = new QStackedWidget( this );
layout->addWidget( cboRendererType );
@ -91,8 +91,11 @@ QgsVectorLayer3DRendererWidget::QgsVectorLayer3DRendererWidget( QgsVectorLayer *
connect( cboRendererType, qgis::overload< int >::of( &QComboBox::currentIndexChanged ), this, &QgsVectorLayer3DRendererWidget::onRendererTypeChanged );
connect( widgetSingleSymbolRenderer, &QgsSingleSymbol3DRendererWidget::widgetChanged, this, &QgsVectorLayer3DRendererWidget::widgetChanged );
connect( widgetRuleBasedRenderer, &QgsRuleBased3DRendererWidget::widgetChanged, this, &QgsVectorLayer3DRendererWidget::widgetChanged );
connect( widgetRuleBasedRenderer, &QgsRuleBased3DRendererWidget::showPanel, this, &QgsPanelWidget::openPanel );
}
void QgsVectorLayer3DRendererWidget::setLayer( QgsVectorLayer *layer )
{
mLayer = layer;
@ -117,6 +120,12 @@ void QgsVectorLayer3DRendererWidget::setLayer( QgsVectorLayer *layer )
whileBlocking( cboRendererType )->setCurrentIndex( pageIndex );
}
void QgsVectorLayer3DRendererWidget::setDockMode( bool dockMode )
{
QgsPanelWidget::setDockMode( dockMode );
widgetRuleBasedRenderer->setDockMode( dockMode );
}
void QgsVectorLayer3DRendererWidget::apply()
{

View File

@ -64,6 +64,8 @@ class QgsVectorLayer3DRendererWidget : public QgsMapLayerConfigWidget
void setLayer( QgsVectorLayer *layer );
void setDockMode( bool dockMode ) override;
public slots:
void apply() override;