QgsSymbolList QgsSingleSymbolRenderer::symbols( QgsRenderContext &context ) const { Q_UNUSED( context ); QgsSymbolList lst; lst.append( mSymbol.get() ); return lst; }
QgsSymbolList QgsFeatureRenderer::originalSymbolsForFeature( QgsFeature &feat, QgsRenderContext &context ) { QgsSymbolList lst; QgsSymbol* s = originalSymbolForFeature( feat, context ); if ( s ) lst.append( s ); return lst; }
QgsSymbolList QgsGraduatedSymbolRenderer::symbols( QgsRenderContext &context ) { Q_UNUSED( context ); QgsSymbolList lst; lst.reserve( mRanges.count() ); Q_FOREACH ( const QgsRendererRange &range, mRanges ) { lst.append( range.symbol() ); }
QgsSingleSymbolRenderer *QgsSingleSymbolRenderer::convertFromRenderer( const QgsFeatureRenderer *renderer ) { QgsSingleSymbolRenderer *r = nullptr; if ( renderer->type() == QLatin1String( "singleSymbol" ) ) { r = dynamic_cast<QgsSingleSymbolRenderer *>( renderer->clone() ); } else if ( renderer->type() == QLatin1String( "pointDisplacement" ) || renderer->type() == QLatin1String( "pointCluster" ) ) { const QgsPointDistanceRenderer *pointDistanceRenderer = dynamic_cast<const QgsPointDistanceRenderer *>( renderer ); if ( pointDistanceRenderer ) r = convertFromRenderer( pointDistanceRenderer->embeddedRenderer() ); } else if ( renderer->type() == QLatin1String( "invertedPolygonRenderer" ) ) { const QgsInvertedPolygonRenderer *invertedPolygonRenderer = dynamic_cast<const QgsInvertedPolygonRenderer *>( renderer ); if ( invertedPolygonRenderer ) r = convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() ); } if ( !r ) { QgsRenderContext context; QgsSymbolList symbols = const_cast<QgsFeatureRenderer *>( renderer )->symbols( context ); if ( !symbols.isEmpty() ) { r = new QgsSingleSymbolRenderer( symbols.at( 0 )->clone() ); } } if ( r ) { r->setOrderBy( renderer->orderBy() ); r->setOrderByEnabled( renderer->orderByEnabled() ); } return r; }
void QgsVectorLayerRenderer::drawRendererLevels( QgsFeatureIterator &fit ) { QHash< QgsSymbol *, QList<QgsFeature> > features; // key = symbol, value = array of features QgsSingleSymbolRenderer *selRenderer = nullptr; if ( !mSelectedFeatureIds.isEmpty() ) { selRenderer = new QgsSingleSymbolRenderer( QgsSymbol::defaultSymbol( mGeometryType ) ); selRenderer->symbol()->setColor( mContext.selectionColor() ); selRenderer->setVertexMarkerAppearance( mVertexMarkerStyle, mVertexMarkerSize ); selRenderer->startRender( mContext, mFields ); } QgsExpressionContextScope *symbolScope = QgsExpressionContextUtils::updateSymbolScope( nullptr, new QgsExpressionContextScope() ); mContext.expressionContext().appendScope( symbolScope ); // 1. fetch features QgsFeature fet; while ( fit.nextFeature( fet ) ) { if ( mContext.renderingStopped() ) { qDebug( "rendering stop!" ); stopRenderer( selRenderer ); delete mContext.expressionContext().popScope(); return; } if ( !fet.hasGeometry() ) continue; // skip features without geometry mContext.expressionContext().setFeature( fet ); QgsSymbol *sym = mRenderer->symbolForFeature( fet, mContext ); if ( !sym ) { continue; } if ( !features.contains( sym ) ) { features.insert( sym, QList<QgsFeature>() ); } features[sym].append( fet ); // new labeling engine if ( mContext.labelingEngine() ) { QgsGeometry obstacleGeometry; QgsSymbolList symbols = mRenderer->originalSymbolsForFeature( fet, mContext ); if ( !symbols.isEmpty() && fet.geometry().type() == QgsWkbTypes::PointGeometry ) { obstacleGeometry = QgsVectorLayerLabelProvider::getPointObstacleGeometry( fet, mContext, symbols ); } if ( !symbols.isEmpty() ) { QgsExpressionContextUtils::updateSymbolScope( symbols.at( 0 ), symbolScope ); } if ( mLabelProvider ) { mLabelProvider->registerFeature( fet, mContext, obstacleGeometry ); } if ( mDiagramProvider ) { mDiagramProvider->registerFeature( fet, mContext, obstacleGeometry ); } } } delete mContext.expressionContext().popScope(); if ( features.empty() ) { // nothing to draw stopRenderer( selRenderer ); return; } // find out the order QgsSymbolLevelOrder levels; QgsSymbolList symbols = mRenderer->symbols( mContext ); for ( int i = 0; i < symbols.count(); i++ ) { QgsSymbol *sym = symbols[i]; for ( int j = 0; j < sym->symbolLayerCount(); j++ ) { int level = sym->symbolLayer( j )->renderingPass(); if ( level < 0 || level >= 1000 ) // ignore invalid levels continue; QgsSymbolLevelItem item( sym, j ); while ( level >= levels.count() ) // append new empty levels levels.append( QgsSymbolLevel() ); levels[level].append( item ); } } // 2. draw features in correct order for ( int l = 0; l < levels.count(); l++ ) { QgsSymbolLevel &level = levels[l]; for ( int i = 0; i < level.count(); i++ ) { QgsSymbolLevelItem &item = level[i]; if ( !features.contains( item.symbol() ) ) { QgsDebugMsg( QStringLiteral( "level item's symbol not found!" ) ); continue; } int layer = item.layer(); QList<QgsFeature> &lst = features[item.symbol()]; QList<QgsFeature>::iterator fit; for ( fit = lst.begin(); fit != lst.end(); ++fit ) { if ( mContext.renderingStopped() ) { stopRenderer( selRenderer ); return; } bool sel = mContext.showSelection() && mSelectedFeatureIds.contains( fit->id() ); // maybe vertex markers should be drawn only during the last pass... bool drawMarker = ( mDrawVertexMarkers && mContext.drawEditingInformation() && ( !mVertexMarkerOnlyForSelection || sel ) ); mContext.expressionContext().setFeature( *fit ); try { mRenderer->renderFeature( *fit, mContext, layer, sel, drawMarker ); } catch ( const QgsCsException &cse ) { Q_UNUSED( cse ); QgsDebugMsg( QStringLiteral( "Failed to transform a point while drawing a feature with ID '%1'. Ignoring this feature. %2" ) .arg( fet.id() ).arg( cse.what() ) ); } } } } stopRenderer( selRenderer ); }
void QgsVectorLayerRenderer::drawRenderer( QgsFeatureIterator &fit ) { QgsExpressionContextScope *symbolScope = QgsExpressionContextUtils::updateSymbolScope( nullptr, new QgsExpressionContextScope() ); mContext.expressionContext().appendScope( symbolScope ); QgsFeature fet; while ( fit.nextFeature( fet ) ) { try { if ( mContext.renderingStopped() ) { QgsDebugMsg( QStringLiteral( "Drawing of vector layer %1 canceled." ).arg( layerId() ) ); break; } if ( !fet.hasGeometry() || fet.geometry().isEmpty() ) continue; // skip features without geometry mContext.expressionContext().setFeature( fet ); bool sel = mContext.showSelection() && mSelectedFeatureIds.contains( fet.id() ); bool drawMarker = ( mDrawVertexMarkers && mContext.drawEditingInformation() && ( !mVertexMarkerOnlyForSelection || sel ) ); // render feature bool rendered = mRenderer->renderFeature( fet, mContext, -1, sel, drawMarker ); // labeling - register feature if ( rendered ) { // new labeling engine if ( mContext.labelingEngine() && ( mLabelProvider || mDiagramProvider ) ) { QgsGeometry obstacleGeometry; QgsSymbolList symbols = mRenderer->originalSymbolsForFeature( fet, mContext ); if ( !symbols.isEmpty() && fet.geometry().type() == QgsWkbTypes::PointGeometry ) { obstacleGeometry = QgsVectorLayerLabelProvider::getPointObstacleGeometry( fet, mContext, symbols ); } if ( !symbols.isEmpty() ) { QgsExpressionContextUtils::updateSymbolScope( symbols.at( 0 ), symbolScope ); } if ( mLabelProvider ) { mLabelProvider->registerFeature( fet, mContext, obstacleGeometry ); } if ( mDiagramProvider ) { mDiagramProvider->registerFeature( fet, mContext, obstacleGeometry ); } } } } catch ( const QgsCsException &cse ) { Q_UNUSED( cse ); QgsDebugMsg( QStringLiteral( "Failed to transform a point while drawing a feature with ID '%1'. Ignoring this feature. %2" ) .arg( fet.id() ).arg( cse.what() ) ); } } delete mContext.expressionContext().popScope(); stopRenderer( nullptr ); }