void QgsUniqueValueDialog::apply() { QgsDebugMsg( "called." ); QgsUniqueValueRenderer *renderer = new QgsUniqueValueRenderer( mVectorLayer->geometryType() ); //go through mValues and add the entries to the renderer for ( QMap<QString, QgsSymbol*>::iterator it = mValues.begin(); it != mValues.end(); ++it ) { QgsSymbol* symbol = it.value(); QgsSymbol* newsymbol = new QgsSymbol( mVectorLayer->geometryType(), symbol->lowerValue(), symbol->upperValue(), symbol->label() ); newsymbol->setPen( symbol->pen() ); newsymbol->setCustomTexture( symbol->customTexture() ); newsymbol->setBrush( symbol->brush() ); newsymbol->setNamedPointSymbol( symbol->pointSymbolName() ); newsymbol->setPointSize( symbol->pointSize() ); newsymbol->setPointSizeUnits( symbol->pointSizeUnits() ); newsymbol->setScaleClassificationField( symbol->scaleClassificationField() ); newsymbol->setRotationClassificationField( symbol->rotationClassificationField() ); renderer->insertValue( it.key(), newsymbol ); } renderer->updateSymbolAttributes(); QgsVectorDataProvider *provider = dynamic_cast<QgsVectorDataProvider *>( mVectorLayer->dataProvider() ); if ( provider ) { int fieldIndex = mClassificationComboBox->itemData( mClassificationComboBox->currentIndex() ).toInt(); if ( fieldIndex != -1 ) { renderer->setClassificationField( fieldIndex ); mVectorLayer->setRenderer( renderer ); return; } } delete renderer; //something went wrong }
QgsUniqueValueDialog::QgsUniqueValueDialog( QgsVectorLayer* vl ): QDialog(), mVectorLayer( vl ), sydialog( vl, true ) { setupUi( this ); setOrientation( Qt::Vertical ); //find out the fields of mVectorLayer if ( mVectorLayer ) { //we cannot use unique values for not-commited fields because QgsVectorLayer has no 'unique values' method... QgsVectorDataProvider* provider = mVectorLayer->dataProvider(); if ( provider ) { const QgsFieldMap & fields = provider->fields(); QString str; for ( QgsFieldMap::const_iterator it = fields.begin(); it != fields.end(); ++it ) { str = ( *it ).name(); str = mVectorLayer->attributeDisplayName( it.key() ); mClassificationComboBox->addItem( str, it.key() ); } } } mClassListWidget->setSelectionMode( QAbstractItemView::ExtendedSelection ); mClassListWidget->setEditTriggers( QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed | QAbstractItemView::AnyKeyPressed ); mClassListWidget->setSortingEnabled( true ); if ( mVectorLayer ) { const QgsUniqueValueRenderer* renderer = dynamic_cast<const QgsUniqueValueRenderer *>( mVectorLayer->renderer() ); if ( renderer ) { mClassListWidget->clear(); QString field = mVectorLayer->attributeDisplayName( renderer->classificationField() ); mOldClassificationAttribute = field; mClassificationComboBox->setCurrentIndex( mClassificationComboBox->findText( field ) ); const QList<QgsSymbol*> list = renderer->symbols(); //fill the items of the renderer into mValues for ( QList<QgsSymbol*>::const_iterator iter = list.begin(); iter != list.end(); ++iter ) { QgsSymbol* symbol = *iter; QString symbolvalue = symbol->lowerValue(); QgsSymbol* sym = new QgsSymbol( mVectorLayer->geometryType(), symbol->lowerValue(), symbol->upperValue(), symbol->label() ); sym->setPen( symbol->pen() ); sym->setCustomTexture( symbol->customTexture() ); sym->setBrush( symbol->brush() ); sym->setNamedPointSymbol( symbol->pointSymbolName() ); sym->setPointSize( symbol->pointSize() ); sym->setPointSizeUnits( symbol->pointSizeUnits() ); sym->setScaleClassificationField( symbol->scaleClassificationField() ); sym->setRotationClassificationField( symbol->rotationClassificationField() ); mValues.insert( symbolvalue, sym ); QListWidgetItem *item = new QListWidgetItem( symbolvalue ); mClassListWidget->addItem( item ); updateEntryIcon( symbol, item ); item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled ); item->setData( Qt::UserRole, symbol->lowerValue() ); item->setToolTip( symbol->label() ); } } } mDeletePushButton->setEnabled( false ); connect( mClassifyButton, SIGNAL( clicked() ), this, SLOT( changeClassificationAttribute() ) ); connect( mAddButton, SIGNAL( clicked() ), this, SLOT( addClass() ) ); connect( mDeletePushButton, SIGNAL( clicked() ), this, SLOT( deleteSelectedClasses() ) ); connect( mRandomizeColors, SIGNAL( clicked() ), this, SLOT( randomizeColors() ) ); connect( mResetColors, SIGNAL( clicked() ), this, SLOT( resetColors() ) ); connect( mClassListWidget, SIGNAL( itemSelectionChanged() ), this, SLOT( selectionChanged() ) ); connect( mCommonPropertyLock, SIGNAL( clicked() ), this, SLOT( selectionChanged() ) ); connect( mClassListWidget, SIGNAL( itemChanged( QListWidgetItem * ) ), this, SLOT( itemChanged( QListWidgetItem * ) ) ); connect( &sydialog, SIGNAL( settingsChanged() ), this, SLOT( applySymbologyChanges() ) ); mSymbolWidgetStack->addWidget( &sydialog ); mSymbolWidgetStack->setCurrentWidget( &sydialog ); }
void QgsGraduatedSymbolRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature & f, QImage* img, bool selected, double opacity ) { QPainter *p = renderContext.painter(); QgsSymbol* theSymbol = symbolForFeature( &f ); if ( !theSymbol ) { if ( img && mGeometryType == QGis::Point ) { img->fill( 0 ); } else if ( mGeometryType != QGis::Point ) { p->setPen( Qt::NoPen ); p->setBrush( Qt::NoBrush ); } return; } //set the qpen and qpainter to the right values // Point if ( img && mGeometryType == QGis::Point ) { double fieldScale = 1.0; double rotation = 0.0; if ( theSymbol->scaleClassificationField() >= 0 ) { //first find out the value for the scale classification attribute const QgsAttributeMap& attrs = f.attributeMap(); fieldScale = sqrt( qAbs( attrs[theSymbol->scaleClassificationField()].toDouble() ) ); QgsDebugMsgLevel( QString( "Feature has field scale factor %1" ).arg( fieldScale ), 3 ); } if ( theSymbol->rotationClassificationField() >= 0 ) { const QgsAttributeMap& attrs = f.attributeMap(); rotation = attrs[theSymbol->rotationClassificationField()].toDouble(); QgsDebugMsgLevel( QString( "Feature has rotation factor %1" ).arg( rotation ), 3 ); } QString oldName; if ( theSymbol->symbolField() >= 0 ) { const QgsAttributeMap& attrs = f.attributeMap(); QString name = attrs[theSymbol->symbolField()].toString(); QgsDebugMsgLevel( QString( "Feature has name %1" ).arg( name ), 3 ); oldName = theSymbol->pointSymbolName(); theSymbol->setNamedPointSymbol( name ); } double scale = renderContext.scaleFactor(); if ( theSymbol->pointSizeUnits() ) { scale = 1.0 / renderContext.mapToPixel().mapUnitsPerPixel(); } *img = theSymbol->getPointSymbolAsImage( scale, selected, mSelectionColor, fieldScale, rotation, renderContext.rasterScaleFactor(), opacity ); if ( !oldName.isNull() ) { theSymbol->setNamedPointSymbol( oldName ); } } // Line, polygon if ( mGeometryType != QGis::Point ) { if ( !selected ) { QPen pen = theSymbol->pen(); pen.setWidthF( renderContext.scaleFactor() * pen.widthF() ); p->setPen( pen ); if ( mGeometryType == QGis::Polygon ) { QBrush brush = theSymbol->brush(); scaleBrush( brush, renderContext.rasterScaleFactor() ); //scale brush content for printout p->setBrush( brush ); } } else { QPen pen = theSymbol->pen(); pen.setWidthF( renderContext.scaleFactor() * pen.widthF() ); if ( mGeometryType == QGis::Polygon ) { QBrush brush = theSymbol->brush(); scaleBrush( brush, renderContext.rasterScaleFactor() ); //scale brush content for printout brush.setColor( mSelectionColor ); p->setBrush( brush ); } else //don't draw outlines in selection color for polys otherwise they appear merged { pen.setColor( mSelectionColor ); } p->setPen( pen ); } } }
void QgsUniqueValueRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* img, bool selected, double opacity ) { QPainter *p = renderContext.painter(); QgsSymbol* symbol = symbolForFeature( &f ); if ( !symbol ) //no matching symbol { if ( img && mGeometryType == QGis::Point ) { img->fill( 0 ); } else if ( mGeometryType != QGis::Point ) { p->setPen( Qt::NoPen ); p->setBrush( Qt::NoBrush ); } return; } // Point if ( img && mGeometryType == QGis::Point ) { double fieldScale = 1.0; double rotation = 0.0; if ( symbol->scaleClassificationField() >= 0 ) { //first find out the value for the scale classification attribute fieldScale = sqrt( qAbs( f.attribute( symbol->scaleClassificationField() ).toDouble() ) ); } if ( symbol->rotationClassificationField() >= 0 ) { rotation = f.attribute( symbol->rotationClassificationField() ).toDouble(); } QString oldName; if ( symbol->symbolField() >= 0 ) { QString name = f.attribute( symbol->symbolField() ).toString(); oldName = symbol->pointSymbolName(); symbol->setNamedPointSymbol( name ); } double scale = renderContext.scaleFactor(); if ( symbol->pointSizeUnits() ) { scale = 1.0 / renderContext.mapToPixel().mapUnitsPerPixel(); } *img = symbol->getPointSymbolAsImage( scale, selected, mSelectionColor, fieldScale, rotation, renderContext.rasterScaleFactor(), opacity ); if ( !oldName.isNull() ) { symbol->setNamedPointSymbol( oldName ); } } // Line, polygon else if ( mGeometryType != QGis::Point ) { if ( !selected ) { QPen pen = symbol->pen(); pen.setWidthF( renderContext.scaleFactor() * pen.widthF() ); p->setPen( pen ); if ( mGeometryType == QGis::Polygon ) { QBrush brush = symbol->brush(); scaleBrush( brush, renderContext.rasterScaleFactor() ); //scale brush content for printout p->setBrush( brush ); } } else { QPen pen = symbol->pen(); pen.setWidthF( renderContext.scaleFactor() * pen.widthF() ); if ( mGeometryType == QGis::Polygon ) { QBrush brush = symbol->brush(); scaleBrush( brush, renderContext.rasterScaleFactor() ); //scale brush content for printout brush.setColor( mSelectionColor ); p->setBrush( brush ); } else //don't draw outlines of polygons in selection color otherwise they appear merged { pen.setColor( mSelectionColor ); } p->setPen( pen ); } } }
QgsSymbol* QgsSymbologyV2Conversion::symbolV2toV1( QgsSymbolV2* s ) { if ( s == NULL || s->symbolLayerCount() == 0 ) return NULL; // we will use only the first symbol layer QgsSymbolLayerV2* sl = s->symbolLayer( 0 ); switch ( sl->type() ) { case QgsSymbolV2::Marker: { QgsMarkerSymbolLayerV2* msl = static_cast<QgsMarkerSymbolLayerV2*>( sl ); QgsSymbol* sOld = new QgsSymbol( QGis::Point ); sOld->setFillColor( sl->color() ); sOld->setFillStyle( Qt::SolidPattern ); sOld->setPointSize( msl->size() ); if ( sl->layerType() == "SimpleMarker" ) { QgsSimpleMarkerSymbolLayerV2* smsl = static_cast<QgsSimpleMarkerSymbolLayerV2*>( sl ); sOld->setColor( smsl->borderColor() ); sOld->setNamedPointSymbol( "hard:" + smsl->name() ); } else if ( sl->layerType() == "SvgMarker" ) { QgsSvgMarkerSymbolLayerV2* smsl = static_cast<QgsSvgMarkerSymbolLayerV2*>( sl ); sOld->setNamedPointSymbol( "svg:" + smsl->path() ); } return sOld; } break; case QgsSymbolV2::Line: { QgsLineSymbolLayerV2* lsl = static_cast<QgsLineSymbolLayerV2*>( sl ); QgsSymbol* sOld = new QgsSymbol( QGis::Line ); sOld->setColor( sl->color() ); sOld->setLineWidth( lsl->width() ); if ( sl->layerType() == "SimpleLine" ) { // add specific settings QgsSimpleLineSymbolLayerV2* slsl = static_cast<QgsSimpleLineSymbolLayerV2*>( sl ); sOld->setLineStyle( slsl->penStyle() ); } return sOld; } case QgsSymbolV2::Fill: { QgsSymbol* sOld = new QgsSymbol( QGis::Polygon ); sOld->setFillColor( sl->color() ); if ( sl->layerType() == "SimpleFill" ) { // add specifc settings QgsSimpleFillSymbolLayerV2* sfsl = static_cast<QgsSimpleFillSymbolLayerV2*>( sl ); sOld->setColor( sfsl->borderColor() ); sOld->setLineWidth( sfsl->borderWidth() ); sOld->setLineStyle( sfsl->borderStyle() ); sOld->setFillStyle( sfsl->brushStyle() ); } return sOld; } } return NULL; // should never get here }