void QgsPointDisplacementRenderer::startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer ) { mRenderer->startRender( context, vlayer ); //create groups with features that have the same position createDisplacementGroups( const_cast<QgsVectorLayer*>( vlayer ), context.extent() ); printInfoDisplacementGroups(); //just for debugging if ( mLabelAttributeName.isEmpty() ) { mLabelIndex = -1; } else { mLabelIndex = vlayer->fieldNameIndex( mLabelAttributeName ); } if ( mMaxLabelScaleDenominator > 0 && context.rendererScale() > mMaxLabelScaleDenominator ) { mDrawLabels = false; } else { mDrawLabels = true; } if ( mCenterSymbol ) { mCenterSymbol->startRender( context, vlayer ); } }
void QgsCategorizedSymbolRendererV2::startRender( QgsRenderContext& context, const QgsFields& fields ) { mCounting = context.rendererScale() == 0.0; // make sure that the hash table is up to date rebuildHash(); // find out classification attribute index from name mAttrNum = fields.fieldNameIndex( mAttrName ); if ( mAttrNum == -1 ) { mExpression.reset( new QgsExpression( mAttrName ) ); mExpression->prepare( fields ); } QgsCategoryList::iterator it = mCategories.begin(); for ( ; it != mCategories.end(); ++it ) { it->symbol()->startRender( context, &fields ); if ( mRotation.data() || mSizeScale.data() ) { QgsSymbolV2* tempSymbol = it->symbol()->clone(); tempSymbol->setRenderHints(( mRotation.data() ? QgsSymbolV2::DataDefinedRotation : 0 ) | ( mSizeScale.data() ? QgsSymbolV2::DataDefinedSizeScale : 0 ) ); tempSymbol->startRender( context, &fields ); mTempSymbols[ it->symbol()] = tempSymbol; } } }
void QgsPointDisplacementRenderer::startRender( QgsRenderContext& context, const QgsFields& fields ) { mRenderer->startRender( context, fields ); mDisplacementGroups.clear(); mGroupIndex.clear(); mSpatialIndex = new QgsSpatialIndex; mSelectedFeatures.clear(); if ( mLabelAttributeName.isEmpty() ) { mLabelIndex = -1; } else { mLabelIndex = fields.fieldNameIndex( mLabelAttributeName ); } if ( mMaxLabelScaleDenominator > 0 && context.rendererScale() > mMaxLabelScaleDenominator ) { mDrawLabels = false; } else { mDrawLabels = true; } if ( mCenterSymbol ) { mCenterSymbol->startRender( context, &fields ); } return; }
void QgsGraduatedSymbolRendererV2::startRender( QgsRenderContext& context, const QgsFields& fields ) { mCounting = context.rendererScale() == 0.0; // find out classification attribute index from name mAttrNum = fields.fieldNameIndex( mAttrName ); if ( mAttrNum == -1 ) { mExpression.reset( new QgsExpression( mAttrName ) ); mExpression->prepare( &context.expressionContext() ); } QgsRangeList::iterator it = mRanges.begin(); for ( ; it != mRanges.end(); ++it ) { if ( !it->symbol() ) continue; it->symbol()->startRender( context, &fields ); if ( mRotation.data() || mSizeScale.data() ) { QgsSymbolV2* tempSymbol = it->symbol()->clone(); tempSymbol->setRenderHints(( mRotation.data() ? QgsSymbolV2::DataDefinedRotation : 0 ) | ( mSizeScale.data() ? QgsSymbolV2::DataDefinedSizeScale : 0 ) ); tempSymbol->startRender( context, &fields ); mTempSymbols[ it->symbol()] = tempSymbol; } } return; }
void QgsCategorizedSymbolRendererV2::startRender( QgsRenderContext& context, const QgsFields& fields ) { mCounting = context.rendererScale() == 0.0; // make sure that the hash table is up to date rebuildHash(); // find out classification attribute index from name mAttrNum = fields.fieldNameIndex( mAttrName ); if ( mAttrNum == -1 ) { mExpression.reset( new QgsExpression( mAttrName ) ); mExpression->prepare( &context.expressionContext() ); } Q_FOREACH ( const QgsRendererCategoryV2& cat, mCategories ) { cat.symbol()->startRender( context, &fields ); if ( mRotation.data() || mSizeScale.data() ) { QgsSymbolV2* tempSymbol = cat.symbol()->clone(); tempSymbol->setRenderHints(( mRotation.data() ? QgsSymbolV2::DataDefinedRotation : 0 ) | ( mSizeScale.data() ? QgsSymbolV2::DataDefinedSizeScale : 0 ) ); tempSymbol->startRender( context, &fields ); mTempSymbols[ cat.symbol()] = tempSymbol; } }
void QgsGraduatedSymbolRenderer::startRender( QgsRenderContext &context, const QgsFields &fields ) { mCounting = context.rendererScale() == 0.0; // find out classification attribute index from name mAttrNum = fields.lookupField( mAttrName ); if ( mAttrNum == -1 ) { mExpression.reset( new QgsExpression( mAttrName ) ); mExpression->prepare( &context.expressionContext() ); } Q_FOREACH ( const QgsRendererRange &range, mRanges ) { if ( !range.symbol() ) continue; range.symbol()->startRender( context, fields ); } }
void QgsRuleBasedRendererV2::startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer ) { double currentScale = context.rendererScale(); // filter out rules which are not compatible with this scale mCurrentRules.clear(); for ( QList<Rule>::iterator it = mRules.begin(); it != mRules.end(); ++it ) { Rule& rule = *it; if ( rule.isScaleOK( currentScale ) ) mCurrentRules.append( &rule ); } QgsFieldMap pendingFields = vlayer->pendingFields(); for ( QList<Rule*>::iterator it = mCurrentRules.begin(); it != mCurrentRules.end(); ++it ) { Rule* rule = *it; QgsExpression* exp = rule->filter(); if ( exp ) exp->prepare( pendingFields ); rule->symbol()->startRender( context ); } }
void QgsTextDiagram::renderDiagram( const QgsFeature& feature, QgsRenderContext& c, const QgsDiagramSettings& s, const QPointF& position ) { Q_UNUSED( feature ); QPainter* p = c.painter(); if ( !p ) { return; } double scaleDenominator = c.rendererScale(); if (( s.minScaleDenominator != -1 && scaleDenominator < s.minScaleDenominator ) || ( s.maxScaleDenominator != -1 && scaleDenominator > s.maxScaleDenominator ) ) { return; } //convert from mm / map units to painter units QSizeF spu = sizePainterUnits( s.size, s, c ); double w = spu.width(); double h = spu.height(); double baseX = position.x(); double baseY = position.y() - h; QList<QPointF> textPositions; //midpoints for text placement int nCategories = s.categoryAttributes.size(); for ( int i = 0; i < nCategories; ++i ) { if ( mOrientation == Horizontal ) { textPositions.push_back( QPointF( baseX + ( w / nCategories ) * i + w / nCategories / 2.0, baseY + h / 2.0 ) ); } else //vertical { textPositions.push_back( QPointF( baseX + w / 2.0, baseY + h / nCategories * i + w / nCategories / 2.0 ) ); } } mPen.setColor( s.penColor ); setPenWidth( mPen, s, c ); p->setPen( mPen ); mBrush.setColor( s.backgroundColor ); p->setBrush( mBrush ); //draw shapes and separator lines first if ( mShape == Circle ) { p->drawEllipse( baseX, baseY, w, h ); //draw separator lines QList<QPointF> intersect; //intersections between shape and separation lines QPointF center( baseX + w / 2.0, baseY + h / 2.0 ); double r1 = w / 2.0; double r2 = h / 2.0; for ( int i = 1; i < nCategories; ++i ) { if ( mOrientation == Horizontal ) { lineEllipseIntersection( QPointF( baseX + w / nCategories * i, baseY ), QPointF( baseX + w / nCategories * i, baseY + h ), center, r1, r2, intersect ); } else //vertical { lineEllipseIntersection( QPointF( baseX, baseY + h / nCategories * i ), QPointF( baseX + w, baseY + h / nCategories * i ), center, r1, r2, intersect ); } if ( intersect.size() > 1 ) { p->drawLine( intersect.at( 0 ), intersect.at( 1 ) ); } } } else if ( mShape == Rectangle ) { p->drawRect( QRectF( baseX, baseY, w, h ) ); for ( int i = 1; i < nCategories; ++i ) { if ( mOrientation == Horizontal ) { p->drawLine( QPointF( baseX + w / nCategories * i, baseY ), QPointF( baseX + w / nCategories * i, baseY + h ) ); } else { p->drawLine( QPointF( baseX, baseY + h / nCategories * i ), QPointF( baseX + w, baseY + h / nCategories * i ) ); } } } else //triangle { QPolygonF triangle; triangle << QPointF( baseX, baseY + h ) << QPointF( baseX + w, baseY + h ) << QPointF( baseX + w / 2.0, baseY ); p->drawPolygon( triangle ); QLineF triangleEdgeLeft( baseX + w / 2.0, baseY, baseX, baseY + h ); QLineF triangleEdgeRight( baseX + w, baseY + h, baseX + w / 2.0, baseY ); QPointF intersectionPoint1, intersectionPoint2; for ( int i = 1; i < nCategories; ++i ) { if ( mOrientation == Horizontal ) { QLineF verticalLine( baseX + w / nCategories * i, baseY + h, baseX + w / nCategories * i, baseY ); if ( baseX + w / nCategories * i < baseX + w / 2.0 ) { verticalLine.intersect( triangleEdgeLeft, &intersectionPoint1 ); } else { verticalLine.intersect( triangleEdgeRight, &intersectionPoint1 ); } p->drawLine( QPointF( baseX + w / nCategories * i, baseY + h ), intersectionPoint1 ); } else //vertical { QLineF horizontalLine( baseX, baseY + h / nCategories * i, baseX + w, baseY + h / nCategories * i ); horizontalLine.intersect( triangleEdgeLeft, &intersectionPoint1 ); horizontalLine.intersect( triangleEdgeRight, &intersectionPoint2 ); p->drawLine( intersectionPoint1, intersectionPoint2 ); } } } //draw text QFont sFont = scaledFont( s, c ); QFontMetricsF fontMetrics( sFont ); p->setFont( sFont ); for ( int i = 0; i < textPositions.size(); ++i ) { QgsExpression* expression = getExpression( s.categoryAttributes.at( i ), feature.fields() ); QString val = expression->evaluate( feature ).toString(); //find out dimesions double textWidth = fontMetrics.width( val ); double textHeight = fontMetrics.height(); mPen.setColor( s.categoryColors.at( i ) ); p->setPen( mPen ); QPointF position = textPositions.at( i ); // Calculate vertical placement double xOffset = 0; switch ( s.labelPlacementMethod ) { case QgsDiagramSettings::Height: xOffset = textHeight / 2.0; break; case QgsDiagramSettings::XHeight: xOffset = fontMetrics.xHeight(); break; } p->drawText( QPointF( position.x() - textWidth / 2.0, position.y() + xOffset ), val ); } }