static void _createCategories( QgsCategoryList& cats, QList<QVariant>& values, QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp ) { // sort the categories first //TODO: make the order configurable? QgsSymbolLayerV2Utils::sortVariantList( values, Qt::AscendingOrder ); int num = values.count(); bool hasNull = false; for ( int i = 0; i < num; i++ ) { QVariant value = values[i]; if ( value.toString().isNull() ) { hasNull = true; } double x = i / ( double ) num; QgsSymbolV2* newSymbol = symbol->clone(); newSymbol->setColor( ramp->color( x ) ); cats.append( QgsRendererCategoryV2( value, newSymbol, value.toString() ) ); } // add null (default) value if not exists if ( !hasNull ) { QgsSymbolV2* newSymbol = symbol->clone(); newSymbol->setColor( ramp->color( 1 ) ); cats.append( QgsRendererCategoryV2( QVariant( "" ), newSymbol, QString() ) ); } }
void QgsGraduatedSymbolRendererV2Widget::updateSymbolsFromWidget() { QgsSymbolV2SelectorWidget* dlg = qobject_cast<QgsSymbolV2SelectorWidget*>( sender() ); delete mGraduatedSymbol; mGraduatedSymbol = dlg->symbol()->clone(); mSizeUnitWidget->blockSignals( true ); mSizeUnitWidget->setUnit( mGraduatedSymbol->outputUnit() ); mSizeUnitWidget->setMapUnitScale( mGraduatedSymbol->mapUnitScale() ); mSizeUnitWidget->blockSignals( false ); QItemSelectionModel* m = viewGraduated->selectionModel(); QModelIndexList selectedIndexes = m->selectedRows( 1 ); if ( m && !selectedIndexes.isEmpty() ) { Q_FOREACH ( const QModelIndex& idx, selectedIndexes ) { if ( idx.isValid() ) { int rangeIdx = idx.row(); QgsSymbolV2* newRangeSymbol = mGraduatedSymbol->clone(); if ( selectedIndexes.count() > 1 ) { //if updating multiple ranges, retain the existing range colors newRangeSymbol->setColor( mRenderer->ranges().at( rangeIdx ).symbol()->color() ); } mRenderer->updateRangeSymbol( rangeIdx, newRangeSymbol ); } } }
void QgsGraduatedSymbolRendererV2Widget::updateSymbolsFromWidget() { QgsRendererWidgetContainer* container = qobject_cast<QgsRendererWidgetContainer*>( mStackedWidget->currentWidget() ); QgsSymbolV2SelectorDialog* dlg = qobject_cast<QgsSymbolV2SelectorDialog*>( container->widget() ); delete mGraduatedSymbol; mGraduatedSymbol = dlg->symbol()->clone(); mSizeUnitWidget->blockSignals( true ); mSizeUnitWidget->setUnit( mGraduatedSymbol->outputUnit() ); mSizeUnitWidget->setMapUnitScale( mGraduatedSymbol->mapUnitScale() ); mSizeUnitWidget->blockSignals( false ); QItemSelectionModel* m = viewGraduated->selectionModel(); QModelIndexList selectedIndexes = m->selectedRows( 1 ); if ( m && !selectedIndexes.isEmpty() ) { Q_FOREACH ( const QModelIndex& idx, selectedIndexes ) { if ( idx.isValid() ) { int rangeIdx = idx.row(); QgsSymbolV2* newRangeSymbol = mGraduatedSymbol->clone(); newRangeSymbol->setColor( mRenderer->ranges()[rangeIdx].symbol()->color() ); mRenderer->updateRangeSymbol( rangeIdx, newRangeSymbol ); } } }
void QgsGraduatedSymbolRendererV2Widget::changeSelectedSymbols() { QItemSelectionModel* m = viewGraduated->selectionModel(); QModelIndexList selectedIndexes = m->selectedRows( 1 ); if ( m && !selectedIndexes.isEmpty() ) { QgsSymbolV2* newSymbol = mGraduatedSymbol->clone(); QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this ); dlg.setMapCanvas( mMapCanvas ); if ( !dlg.exec() ) { delete newSymbol; return; } Q_FOREACH ( const QModelIndex& idx, selectedIndexes ) { if ( idx.isValid() ) { int rangeIdx = idx.row(); QgsSymbolV2* newRangeSymbol = newSymbol->clone(); newRangeSymbol->setColor( mRenderer->ranges()[rangeIdx].symbol()->color() ); mRenderer->updateRangeSymbol( rangeIdx, newRangeSymbol ); } } }
void QgsGraduatedSymbolRendererV2::updateColorRamp( QgsVectorColorRampV2 *ramp, bool inverted ) { int i = 0; if ( ramp ) { setSourceColorRamp( ramp ); setInvertedColorRamp( inverted ); } if ( mSourceColorRamp ) { foreach ( QgsRendererRangeV2 range, mRanges ) { QgsSymbolV2 *symbol = range.symbol() ? range.symbol()->clone() : 0; if ( symbol ) { double colorValue; if ( inverted ) colorValue = ( mRanges.count() > 1 ? ( double )( mRanges.count() - i - 1 ) / ( mRanges.count() - 1 ) : 0 ); else colorValue = ( mRanges.count() > 1 ? ( double ) i / ( mRanges.count() - 1 ) : 0 ); symbol->setColor( mSourceColorRamp->color( colorValue ) ); } updateRangeSymbol( i, symbol ); ++i; } }
void QgsCategorizedSymbolRendererV2::updateSymbols( QgsSymbolV2 * sym ) { int i = 0; foreach ( QgsRendererCategoryV2 cat, mCategories ) { QgsSymbolV2* symbol = sym->clone(); symbol->setColor( cat.symbol()->color() ); updateCategorySymbol( i, symbol ); ++i; }
void QgsGraduatedSymbolRendererV2::updateColorRamp( QgsVectorColorRampV2 *ramp ) { int i = 0; foreach( QgsRendererRangeV2 range, mRanges ) { QgsSymbolV2* symbol = range.symbol()->clone(); double colorValue = ( mRanges.count() > 1 ? ( double ) i / ( mRanges.count() - 1 ) : 0 ); symbol->setColor( ramp->color( colorValue ) ); updateRangeSymbol( i, symbol ); ++i; }
QgsSymbolV2* QgsSymbolV2::defaultSymbol( QGis::GeometryType geomType ) { QgsSymbolV2* s; switch ( geomType ) { case QGis::Point: s = new QgsMarkerSymbolV2(); break; case QGis::Line: s = new QgsLineSymbolV2(); break; case QGis::Polygon: s = new QgsFillSymbolV2(); break; default: QgsDebugMsg( "unknown layer's geometry type" ); return NULL; } s->setColor( QColor::fromHsv( rand() % 360, 64 + rand() % 192, 128 + rand() % 128 ) ); return s; }
QgsSymbolV2* QgsSymbolV2::defaultSymbol( QGis::GeometryType geomType ) { QgsSymbolV2* s = 0; // override global default if project has a default for this type QString defaultSymbol; switch ( geomType ) { case QGis::Point : defaultSymbol = QgsProject::instance()->readEntry( "DefaultStyles", "/Marker", "" ); break; case QGis::Line : defaultSymbol = QgsProject::instance()->readEntry( "DefaultStyles", "/Line", "" ); break; case QGis::Polygon : defaultSymbol = QgsProject::instance()->readEntry( "DefaultStyles", "/Fill", "" ); break; default: defaultSymbol = ""; break; } if ( defaultSymbol != "" ) s = QgsStyleV2::defaultStyle()->symbol( defaultSymbol ); // if no default found for this type, get global default (as previously) if ( ! s ) { switch ( geomType ) { case QGis::Point: s = new QgsMarkerSymbolV2(); break; case QGis::Line: s = new QgsLineSymbolV2(); break; case QGis::Polygon: s = new QgsFillSymbolV2(); break; default: QgsDebugMsg( "unknown layer's geometry type" ); return NULL; } } // set alpha transparency s->setAlpha( QgsProject::instance()->readDoubleEntry( "DefaultStyles", "/AlphaInt", 255 ) / 255.0 ); // set random color, it project prefs allow if ( defaultSymbol == "" || QgsProject::instance()->readBoolEntry( "DefaultStyles", "/RandomColors", true ) ) { s->setColor( QColor::fromHsv( qrand() % 360, 64 + qrand() % 192, 128 + qrand() % 128 ) ); } return s; }
void QgsCategorizedSymbolRendererV2Widget::changeSelectedSymbols() { QList<int> selectedCats = selectedCategories(); if ( selectedCats.size() > 0 ) { QgsSymbolV2* newSymbol = mCategorizedSymbol->clone(); QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this ); if ( !dlg.exec() ) { delete newSymbol; return; } foreach ( const int idx, selectedCats ) { QgsRendererCategoryV2 category = mRenderer->categories().value( idx ); QgsSymbolV2* newCatSymbol = newSymbol->clone(); newCatSymbol->setColor( mRenderer->categories()[idx].symbol()->color() ); mRenderer->updateCategorySymbol( idx, newCatSymbol ); }
void QgsCategorizedSymbolRendererV2Widget::changeSelectedSymbols() { QList<int> selectedCats = selectedCategories(); if ( !selectedCats.isEmpty() ) { QgsSymbolV2* newSymbol = mCategorizedSymbol->clone(); QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this ); dlg.setMapCanvas( mMapCanvas ); if ( !dlg.exec() ) { delete newSymbol; return; } Q_FOREACH ( int idx, selectedCats ) { QgsRendererCategoryV2 category = mRenderer->categories().value( idx ); QgsSymbolV2* newCatSymbol = newSymbol->clone(); newCatSymbol->setColor( mRenderer->categories()[idx].symbol()->color() ); mRenderer->updateCategorySymbol( idx, newCatSymbol ); }
QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer( QgsVectorLayer* vlayer, QString attrName, int classes, Mode mode, QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp, bool inverted ) { if ( classes < 1 ) return NULL; int attrNum = vlayer->fieldNameIndex( attrName ); double minimum; double maximum; QScopedPointer<QgsExpression> expression; if ( attrNum == -1 ) { // try to use expression expression.reset( new QgsExpression( attrName ) ); if ( expression->hasParserError() || !expression->prepare( vlayer->pendingFields() ) ) return 0; // should have a means to report errors QList<double> values; QgsFeatureIterator fit = vlayer->getFeatures(); QgsFeature feature; while ( fit.nextFeature( feature ) ) { values << expression->evaluate( feature ).toDouble(); } qSort( values ); minimum = values.first(); maximum = values.last(); } else { minimum = vlayer->minimumValue( attrNum ).toDouble(); maximum = vlayer->maximumValue( attrNum ).toDouble(); } QgsDebugMsg( QString( "min %1 // max %2" ).arg( minimum ).arg( maximum ) ); QList<double> breaks; QList<int> labels; if ( mode == EqualInterval ) { breaks = _calcEqualIntervalBreaks( minimum, maximum, classes ); } else if ( mode == Pretty ) { breaks = _calcPrettyBreaks( minimum, maximum, classes ); } else if ( mode == Quantile || mode == Jenks || mode == StdDev ) { // get values from layer QList<double> values; QgsFeature f; QStringList lst; if ( expression.isNull() ) lst.append( attrName ); else lst = expression->referencedColumns(); QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( lst, vlayer->pendingFields() ) ); // create list of non-null attribute values while ( fit.nextFeature( f ) ) { QVariant v = expression.isNull() ? f.attribute( attrNum ) : expression->evaluate( f ); if ( !v.isNull() ) values.append( v.toDouble() ); } // calculate the breaks if ( mode == Quantile ) { breaks = _calcQuantileBreaks( values, classes ); } else if ( mode == Jenks ) { breaks = _calcJenksBreaks( values, classes, minimum, maximum ); } else if ( mode == StdDev ) { breaks = _calcStdDevBreaks( values, classes, labels ); } } else { Q_ASSERT( false ); } QgsRangeList ranges; double lower, upper = minimum; QString label; // "breaks" list contains all values at class breaks plus maximum as last break int i = 0; for ( QList<double>::iterator it = breaks.begin(); it != breaks.end(); ++it, ++i ) { lower = upper; // upper border from last interval upper = *it; if ( mode == StdDev ) { if ( i == 0 ) { label = "< " + QString::number( labels[i], 'i', 0 ) + " Std Dev"; } else if ( i == labels.count() - 1 ) { label = ">= " + QString::number( labels[i-1], 'i', 0 ) + " Std Dev"; } else { label = QString::number( labels[i-1], 'i', 0 ) + " Std Dev" + " - " + QString::number( labels[i], 'i', 0 ) + " Std Dev"; } } else { label = QString::number( lower, 'f', 4 ) + " - " + QString::number( upper, 'f', 4 ); } QgsSymbolV2* newSymbol = symbol->clone(); double colorValue; if ( inverted ) colorValue = ( breaks.count() > 1 ? ( double )( breaks.count() - i - 1 ) / ( breaks.count() - 1 ) : 0 ); else colorValue = ( breaks.count() > 1 ? ( double ) i / ( breaks.count() - 1 ) : 0 ); newSymbol->setColor( ramp->color( colorValue ) ); // color from (0 / cl-1) to (cl-1 / cl-1) ranges.append( QgsRendererRangeV2( lower, upper, newSymbol, label ) ); } QgsGraduatedSymbolRendererV2* r = new QgsGraduatedSymbolRendererV2( attrName, ranges ); r->setSourceSymbol( symbol->clone() ); r->setSourceColorRamp( ramp->clone() ); r->setInvertedColorRamp( inverted ); r->setMode( mode ); return r; }
QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer( QgsVectorLayer* vlayer, QString attrName, int classes, Mode mode, QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp ) { if ( classes < 1 ) return NULL; int attrNum = vlayer->fieldNameIndex( attrName ); double minimum = vlayer->minimumValue( attrNum ).toDouble(); double maximum = vlayer->maximumValue( attrNum ).toDouble(); QgsDebugMsg( QString( "min %1 // max %2" ).arg( minimum ).arg( maximum ) ); QList<double> breaks; QList<int> labels; if ( mode == EqualInterval ) { breaks = _calcEqualIntervalBreaks( minimum, maximum, classes ); } else if ( mode == Pretty ) { breaks = _calcPrettyBreaks( minimum, maximum, classes ); } else if ( mode == Quantile || mode == Jenks || mode == StdDev ) { // get values from layer QList<double> values; QgsFeature f; QgsAttributeList lst; lst.append( attrNum ); QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( lst ) ); // create list of non-null attribute values while ( fit.nextFeature( f ) ) if ( !f.attribute( attrNum ).isNull() ) values.append( f.attribute( attrNum ).toDouble() ); // calculate the breaks if ( mode == Quantile ) { breaks = _calcQuantileBreaks( values, classes ); } else if ( mode == Jenks ) { breaks = _calcJenksBreaks( values, classes, minimum, maximum ); } else if ( mode == StdDev ) { breaks = _calcStdDevBreaks( values, classes, labels ); } } else { Q_ASSERT( false ); } QgsRangeList ranges; double lower, upper = minimum; QString label; // "breaks" list contains all values at class breaks plus maximum as last break int i = 0; for ( QList<double>::iterator it = breaks.begin(); it != breaks.end(); ++it, ++i ) { lower = upper; // upper border from last interval upper = *it; if ( mode == StdDev ) { if ( i == 0 ) { label = "< " + QString::number( labels[i], 'i', 0 ) + " Std Dev"; } else if ( i == labels.count() - 1 ) { label = ">= " + QString::number( labels[i-1], 'i', 0 ) + " Std Dev"; } else { label = QString::number( labels[i-1], 'i', 0 ) + " Std Dev" + " - " + QString::number( labels[i], 'i', 0 ) + " Std Dev"; } } else { label = QString::number( lower, 'f', 4 ) + " - " + QString::number( upper, 'f', 4 ); } QgsSymbolV2* newSymbol = symbol->clone(); double colorValue = ( breaks.count() > 1 ? ( double ) i / ( breaks.count() - 1 ) : 0 ); newSymbol->setColor( ramp->color( colorValue ) ); // color from (0 / cl-1) to (cl-1 / cl-1) ranges.append( QgsRendererRangeV2( lower, upper, newSymbol, label ) ); } QgsGraduatedSymbolRendererV2* r = new QgsGraduatedSymbolRendererV2( attrName, ranges ); r->setSourceSymbol( symbol->clone() ); r->setSourceColorRamp( ramp->clone() ); r->setMode( mode ); return r; }
QgsGrassEditRenderer::QgsGrassEditRenderer() : QgsFeatureRendererV2( "grassEdit" ) , mLineRenderer( 0 ) , mMarkerRenderer( 0 ) { QHash<int, QColor> colors; //colors.insert( QgsGrassVectorMap::TopoUndefined, QColor( 125, 125, 125 ) ); colors.insert( QgsGrassVectorMap::TopoLine, QColor( Qt::black ) ); colors.insert( QgsGrassVectorMap::TopoBoundaryError, QColor( Qt::red ) ); colors.insert( QgsGrassVectorMap::TopoBoundaryErrorLeft, QColor( 255, 125, 0 ) ); colors.insert( QgsGrassVectorMap::TopoBoundaryErrorRight, QColor( 255, 125, 0 ) ); colors.insert( QgsGrassVectorMap::TopoBoundaryOk, QColor( Qt::green ) ); QHash<int, QString> labels; //labels.insert( QgsGrassVectorMap::TopoUndefined, "Unknown type" ); labels.insert( QgsGrassVectorMap::TopoLine, "Line" ); labels.insert( QgsGrassVectorMap::TopoBoundaryError, "Boundary (topological error on both sides)" ); labels.insert( QgsGrassVectorMap::TopoBoundaryErrorLeft, "Boundary (topological error on the left side)" ); labels.insert( QgsGrassVectorMap::TopoBoundaryErrorRight, "Boundary (topological error on the right side)" ); labels.insert( QgsGrassVectorMap::TopoBoundaryOk, "Boundary (correct)" ); QgsCategoryList categoryList; // first/last vertex marker to distinguish vertices from nodes QgsMarkerLineSymbolLayerV2 * firstVertexMarkerLine = new QgsMarkerLineSymbolLayerV2( false ); QgsSimpleMarkerSymbolLayerV2 *markerSymbolLayer = new QgsSimpleMarkerSymbolLayerV2( QgsSimpleMarkerSymbolLayerBase::Cross2, 2 ); markerSymbolLayer->setColor( QColor( 255, 0, 0 ) ); markerSymbolLayer->setBorderColor( QColor( 255, 0, 0 ) ); markerSymbolLayer->setOutlineWidth( 0.5 ); QgsSymbolLayerV2List markerLayers; markerLayers << markerSymbolLayer; QgsMarkerSymbolV2 * markerSymbol = new QgsMarkerSymbolV2( markerLayers ); firstVertexMarkerLine->setSubSymbol( markerSymbol ); firstVertexMarkerLine->setPlacement( QgsMarkerLineSymbolLayerV2::FirstVertex ); QgsMarkerLineSymbolLayerV2 * lastVertexMarkerLine = static_cast<QgsMarkerLineSymbolLayerV2 *>( firstVertexMarkerLine->clone() ); lastVertexMarkerLine->setPlacement( QgsMarkerLineSymbolLayerV2::LastVertex ); Q_FOREACH ( int value, colors.keys() ) { QgsSymbolV2 * symbol = QgsSymbolV2::defaultSymbol( QGis::Line ); symbol->setColor( colors.value( value ) ); symbol->appendSymbolLayer( firstVertexMarkerLine->clone() ); symbol->appendSymbolLayer( lastVertexMarkerLine->clone() ); categoryList << QgsRendererCategoryV2( QVariant( value ), symbol, labels.value( value ) ); } delete firstVertexMarkerLine; delete lastVertexMarkerLine; mLineRenderer = new QgsCategorizedSymbolRendererV2( "topo_symbol", categoryList ); colors.clear(); labels.clear(); colors.insert( QgsGrassVectorMap::TopoPoint, QColor( 0, 255, 255 ) ); colors.insert( QgsGrassVectorMap::TopoCentroidIn, QColor( 0, 255, 0 ) ); colors.insert( QgsGrassVectorMap::TopoCentroidOut, QColor( 255, 0, 0 ) ); colors.insert( QgsGrassVectorMap::TopoCentroidDupl, QColor( 255, 0, 255 ) ); labels.insert( QgsGrassVectorMap::TopoPoint, "Point" ); labels.insert( QgsGrassVectorMap::TopoCentroidIn, "Centroid in area" ); labels.insert( QgsGrassVectorMap::TopoCentroidOut, "Centroid outside area" ); labels.insert( QgsGrassVectorMap::TopoCentroidDupl, "Duplicate centroid" ); categoryList.clear(); Q_FOREACH ( int value, colors.keys() ) { QgsSymbolV2 * symbol = QgsSymbolV2::defaultSymbol( QGis::Point ); symbol->setColor( colors.value( value ) ); categoryList << QgsRendererCategoryV2( QVariant( value ), symbol, labels.value( value ) ); } mMarkerRenderer = new QgsCategorizedSymbolRendererV2( "topo_symbol", categoryList ); }