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; } } return; }
QList<QString> QgsCategorizedSymbolRendererV2::usedAttributes() { QSet<QString> attributes; // mAttrName can contain either attribute name or an expression. // Sometimes it is not possible to distinguish between those two, // e.g. "a - b" can be both a valid attribute name or expression. // Since we do not have access to fields here, try both options. attributes << mAttrName; QgsExpression testExpr( mAttrName ); if ( !testExpr.hasParserError() ) attributes.unite( testExpr.referencedColumns().toSet() ); if ( mRotation.data() ) attributes.unite( mRotation->referencedColumns().toSet() ); if ( mSizeScale.data() ) attributes.unite( mSizeScale->referencedColumns().toSet() ); QgsCategoryList::const_iterator catIt = mCategories.constBegin(); for ( ; catIt != mCategories.constEnd(); ++catIt ) { QgsSymbolV2* catSymbol = catIt->symbol(); if ( catSymbol ) { attributes.unite( catSymbol->usedAttributes() ); } } return attributes.toList(); }
void QgsStyleV2ManagerDialog::populateSymbols( const QStringList& symbolNames, bool check ) { QStandardItemModel* model = qobject_cast<QStandardItemModel*>( listItems->model() ); model->clear(); int type = currentItemType(); for ( int i = 0; i < symbolNames.count(); ++i ) { QString name = symbolNames[i]; QgsSymbolV2* symbol = mStyle->symbol( name ); if ( symbol && symbol->type() == type ) { QStandardItem* item = new QStandardItem( name ); QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( symbol, listItems->iconSize() ); item->setIcon( icon ); item->setData( name ); // used to find out original name when user edited the name item->setCheckable( check ); item->setToolTip( name ); // add to model model->appendRow( item ); } delete symbol; } selectedSymbolsChanged( QItemSelection(), QItemSelection() ); symbolSelected( listItems->currentIndex() ); }
QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForFeature( QgsFeature& feature ) { QgsSymbolV2* symbol = originalSymbolForFeature( feature ); if ( !symbol ) return 0; if ( !mRotation.data() && !mSizeScale.data() ) return symbol; // no data-defined rotation/scaling - just return the symbol // find out rotation, size scale const double rotation = mRotation.data() ? mRotation->evaluate( feature ).toDouble() : 0; const double sizeScale = mSizeScale.data() ? mSizeScale->evaluate( feature ).toDouble() : 1.; // take a temporary symbol (or create it if doesn't exist) QgsSymbolV2* tempSymbol = mTempSymbols[symbol]; // modify the temporary symbol and return it if ( tempSymbol->type() == QgsSymbolV2::Marker ) { QgsMarkerSymbolV2* markerSymbol = static_cast<QgsMarkerSymbolV2*>( tempSymbol ); if ( mRotation.data() ) markerSymbol->setAngle( rotation ); markerSymbol->setSize( sizeScale * static_cast<QgsMarkerSymbolV2*>( symbol )->size() ); markerSymbol->setScaleMethod( mScaleMethod ); } else if ( tempSymbol->type() == QgsSymbolV2::Line ) { QgsLineSymbolV2* lineSymbol = static_cast<QgsLineSymbolV2*>( tempSymbol ); lineSymbol->setWidth( sizeScale * static_cast<QgsLineSymbolV2*>( symbol )->width() ); } return tempSymbol; }
void QgsGraduatedSymbolRendererV2Widget::changeSelectedSymbols() { QItemSelectionModel* m = viewGraduated->selectionModel(); QModelIndexList selectedIndexes = m->selectedRows( 1 ); if ( m && selectedIndexes.size() > 0 ) { QgsSymbolV2* newSymbol = mGraduatedSymbol->clone(); QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this ); if ( !dlg.exec() ) { delete newSymbol; return; } foreach ( 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 ); } } }
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 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 QgsVectorLayer *vlayer ) { // make sure that the hash table is up to date rebuildHash(); // find out classification attribute index from name mAttrNum = vlayer ? vlayer->fieldNameIndex( mAttrName ) : -1; if ( mAttrNum == -1 ) { mExpression.reset( new QgsExpression( mAttrName ) ); mExpression->prepare( vlayer->pendingFields() ); } QgsCategoryList::iterator it = mCategories.begin(); for ( ; it != mCategories.end(); ++it ) { it->symbol()->startRender( context, vlayer ); 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, vlayer ); mTempSymbols[ it->value().toString()] = tempSymbol; } } }
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 QgsSymbolLevelsV2Dialog::populateTable() { for ( int row = 0; row < mList.count(); row++ ) { QgsSymbolV2* sym = mList[row].second; QString label = mList[row].first; QTableWidgetItem *itemLabel = new QTableWidgetItem( label ); itemLabel->setFlags( itemLabel->flags() ^ Qt::ItemIsEditable ); tableLevels->setItem( row, 0, itemLabel ); for ( int layer = 0; layer < mMaxLayers; layer++ ) { QTableWidgetItem* item; if ( layer >= sym->symbolLayerCount() ) { item = new QTableWidgetItem(); item->setFlags( Qt::ItemFlags() ); } else { QgsSymbolLayerV2* sl = sym->symbolLayer( layer ); QIcon icon = QgsSymbolLayerV2Utils::symbolLayerPreviewIcon( sl, QgsSymbolV2::MM, QSize( 16, 16 ) ); item = new QTableWidgetItem( icon, QString::number( sl->renderingPass() ) ); } tableLevels->setItem( row, layer + 1, item ); tableLevels->resizeColumnToContents( 0 ); } } }
void QgsCategorizedSymbolRendererV2::startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer ) { // make sure that the hash table is up to date rebuildHash(); // find out classification attribute index from name mAttrNum = vlayer ? vlayer->fieldNameIndex( mAttrName ) : -1; mRotationFieldIdx = ( mRotationField.isEmpty() ? -1 : vlayer->fieldNameIndex( mRotationField ) ); mSizeScaleFieldIdx = ( mSizeScaleField.isEmpty() ? -1 : vlayer->fieldNameIndex( mSizeScaleField ) ); QgsCategoryList::iterator it = mCategories.begin(); for ( ; it != mCategories.end(); ++it ) { it->symbol()->startRender( context, vlayer ); if ( mRotationFieldIdx != -1 || mSizeScaleFieldIdx != -1 ) { QgsSymbolV2* tempSymbol = it->symbol()->clone(); tempSymbol->setRenderHints(( mRotationFieldIdx != -1 ? QgsSymbolV2::DataDefinedRotation : 0 ) | ( mSizeScaleFieldIdx != -1 ? QgsSymbolV2::DataDefinedSizeScale : 0 ) ); tempSymbol->startRender( context, vlayer ); mTempSymbols[ it->value().toString()] = tempSymbol; } } }
QList<QString> QgsGraduatedSymbolRendererV2::usedAttributes() { QSet<QString> attributes; attributes.insert( mAttrName ); if ( !mRotationField.isEmpty() ) { attributes.insert( mRotationField ); } if ( !mSizeScaleField.isEmpty() ) { attributes.insert( mSizeScaleField ); } QgsSymbolV2* symbol = 0; QgsRangeList::const_iterator range_it = mRanges.constBegin(); for ( ; range_it != mRanges.constEnd(); ++range_it ) { symbol = range_it->symbol(); if ( symbol ) { attributes.unite( symbol->usedAttributes() ); } } return attributes.toList(); }
QgsSymbolV2* QgsFillSymbolV2::clone() const { QgsSymbolV2* cloneSymbol = new QgsFillSymbolV2( cloneLayers() ); cloneSymbol->setOutputUnit( mOutputUnit ); cloneSymbol->setAlpha( mAlpha ); return cloneSymbol; }
QgsSymbolV2* QgsMarkerSymbolV2::clone() const { QgsSymbolV2* cloneSymbol = new QgsMarkerSymbolV2( cloneLayers() ); cloneSymbol->setAlpha( mAlpha ); cloneSymbol->setLayer( mLayer ); cloneSymbol->setClipFeaturesToExtent( mClipFeaturesToExtent ); return cloneSymbol; }
void QgsSymbolLevelsV2Dialog::renderingPassChanged( int row, int column ) { if ( row < 0 || row >= mList.count() ) return; QgsSymbolV2* sym = mList[row].second; if ( column < 0 || column >= sym->symbolLayerCount() ) return; sym->symbolLayer( column )->setRenderingPass( tableLevels->item( row, column )->text().toInt() ); }
QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForFeature( QgsFeature& feature ) { const QgsAttributeMap& attrMap = feature.attributeMap(); QgsAttributeMap::const_iterator ita = attrMap.find( mAttrNum ); if ( ita == attrMap.end() ) { QgsDebugMsg( "attribute '" + mAttrName + "' (index " + QString::number( mAttrNum ) + ") required by renderer not found" ); return NULL; } // find the right symbol for the category QgsSymbolV2* symbol = symbolForValue( *ita ); if ( symbol == NULL ) { // if no symbol found use default one //return symbolForValue( QVariant( "" ) ); // What is default? Empty string may be a legal value, and features not found // should not be rendered using empty string value category symbology. // We also need to get NULL in that case so that willRenderFeature() // may be used to count features. return 0; } if ( mRotationFieldIdx == -1 && mSizeScaleFieldIdx == -1 ) return symbol; // no data-defined rotation/scaling - just return the symbol // find out rotation, size scale double rotation = 0; double sizeScale = 1; if ( mRotationFieldIdx != -1 ) rotation = attrMap[mRotationFieldIdx].toDouble(); if ( mSizeScaleFieldIdx != -1 ) sizeScale = attrMap[mSizeScaleFieldIdx].toDouble(); // take a temporary symbol (or create it if doesn't exist) QgsSymbolV2* tempSymbol = mTempSymbols[ita->toString()]; // modify the temporary symbol and return it if ( tempSymbol->type() == QgsSymbolV2::Marker ) { QgsMarkerSymbolV2* markerSymbol = static_cast<QgsMarkerSymbolV2*>( tempSymbol ); if ( mRotationFieldIdx != -1 ) markerSymbol->setAngle( rotation ); if ( mSizeScaleFieldIdx != -1 ) markerSymbol->setSize( sizeScale * static_cast<QgsMarkerSymbolV2*>( symbol )->size() ); markerSymbol->setScaleMethod( mScaleMethod ); } else if ( tempSymbol->type() == QgsSymbolV2::Line ) { QgsLineSymbolV2* lineSymbol = static_cast<QgsLineSymbolV2*>( tempSymbol ); if ( mSizeScaleFieldIdx != -1 ) lineSymbol->setWidth( sizeScale * static_cast<QgsLineSymbolV2*>( symbol )->width() ); } return tempSymbol; }
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; }
QgsSymbolLevelsV2Dialog::QgsSymbolLevelsV2Dialog( QgsLegendSymbolList list, bool usingSymbolLevels, QWidget* parent ) : QDialog( parent ), mList( list ), mForceOrderingEnabled( false ) { setupUi( this ); QSettings settings; restoreGeometry( settings.value( "/Windows/symbolLevelsDlg/geometry" ).toByteArray() ); tableLevels->setItemDelegate( new SpinBoxDelegate( this ) ); chkEnable->setChecked( usingSymbolLevels ); connect( chkEnable, SIGNAL( clicked() ), this, SLOT( updateUi() ) ); if ( mList.count() > 0 && !mList[0].second ) { // remove symbolless entry (probably classifier of categorized renderer) mList.removeFirst(); } int maxLayers = 0; tableLevels->setRowCount( mList.count() ); for ( int i = 0; i < mList.count(); i++ ) { QgsSymbolV2* sym = mList[i].second; // set icons for the rows QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( sym, QSize( 16, 16 ) ); tableLevels->setVerticalHeaderItem( i, new QTableWidgetItem( icon, QString() ) ); // find out max. number of layers per symbol int layers = sym->symbolLayerCount(); if ( layers > maxLayers ) maxLayers = layers; } tableLevels->setColumnCount( maxLayers + 1 ); tableLevels->setHorizontalHeaderItem( 0, new QTableWidgetItem( QString() ) ); for ( int i = 0; i < maxLayers; i++ ) { QString name = tr( "Layer %1" ).arg( i ); tableLevels->setHorizontalHeaderItem( i + 1, new QTableWidgetItem( name ) ); } mMaxLayers = maxLayers; updateUi(); if ( !usingSymbolLevels ) setDefaultLevels(); populateTable(); connect( tableLevels, SIGNAL( cellChanged( int, int ) ), this, SLOT( renderingPassChanged( int, int ) ) ); }
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; }
void QgsSymbolLevelsV2Dialog::setDefaultLevels() { for ( int i = 0; i < mList.count(); i++ ) { QgsSymbolV2* sym = mList[i].second; for ( int layer = 0; layer < sym->symbolLayerCount(); layer++ ) { sym->symbolLayer( layer )->setRenderingPass( layer ); } } }
QgsSymbolV2* QgsGraduatedSymbolRendererV2::symbolForFeature( QgsFeature& feature ) { const QgsAttributes& attrs = feature.attributes(); if ( mAttrNum < 0 || mAttrNum >= attrs.count() ) { QgsDebugMsg( "attribute required by renderer not found: " + mAttrName + "(index " + QString::number( mAttrNum ) + ")" ); return NULL; } // Null values should not be categorized if ( attrs[mAttrNum].isNull() ) return NULL; // find the right category QgsSymbolV2* symbol = symbolForValue( attrs[mAttrNum].toDouble() ); if ( symbol == NULL ) return NULL; if ( mRotationFieldIdx == -1 && mSizeScaleFieldIdx == -1 ) return symbol; // no data-defined rotation/scaling - just return the symbol // find out rotation, size scale double rotation = 0; double sizeScale = 1; if ( mRotationFieldIdx != -1 ) rotation = attrs[mRotationFieldIdx].toDouble(); if ( mSizeScaleFieldIdx != -1 ) sizeScale = attrs[mSizeScaleFieldIdx].toDouble(); // take a temporary symbol (or create it if doesn't exist) QgsSymbolV2* tempSymbol = mTempSymbols[symbol]; // modify the temporary symbol and return it if ( tempSymbol->type() == QgsSymbolV2::Marker ) { QgsMarkerSymbolV2* markerSymbol = static_cast<QgsMarkerSymbolV2*>( tempSymbol ); if ( mRotationFieldIdx != -1 ) markerSymbol->setAngle( rotation ); if ( mSizeScaleFieldIdx != -1 ) markerSymbol->setSize( sizeScale * static_cast<QgsMarkerSymbolV2*>( symbol )->size() ); markerSymbol->setScaleMethod( mScaleMethod ); } else if ( tempSymbol->type() == QgsSymbolV2::Line ) { QgsLineSymbolV2* lineSymbol = static_cast<QgsLineSymbolV2*>( tempSymbol ); if ( mSizeScaleFieldIdx != -1 ) lineSymbol->setWidth( sizeScale * static_cast<QgsLineSymbolV2*>( symbol )->width() ); } return tempSymbol; }
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* QgsCategorizedSymbolRendererV2::symbolForFeature( QgsFeature& feature ) { const QgsAttributes& attrs = feature.attributes(); QVariant value; if ( mAttrNum == -1 ) { Q_ASSERT( mExpression.data() ); value = mExpression->evaluate( &feature ); } else { value = attrs[mAttrNum]; } // find the right symbol for the category QgsSymbolV2* symbol = symbolForValue( value ); if ( symbol == NULL ) { // if no symbol found use default one return symbolForValue( QVariant( "" ) ); } if ( !mRotation.data() && !mSizeScale.data() ) return symbol; // no data-defined rotation/scaling - just return the symbol // find out rotation, size scale const double rotation = mRotation.data() ? mRotation->evaluate( feature ).toDouble() : 0; const double sizeScale = mSizeScale.data() ? mSizeScale->evaluate( feature ).toDouble() : 1.; // take a temporary symbol (or create it if doesn't exist) QgsSymbolV2* tempSymbol = mTempSymbols[value.toString()]; // modify the temporary symbol and return it if ( tempSymbol->type() == QgsSymbolV2::Marker ) { QgsMarkerSymbolV2* markerSymbol = static_cast<QgsMarkerSymbolV2*>( tempSymbol ); if ( mRotation.data() ) markerSymbol->setAngle( rotation ); markerSymbol->setSize( sizeScale * static_cast<QgsMarkerSymbolV2*>( symbol )->size() ); markerSymbol->setScaleMethod( mScaleMethod ); } else if ( tempSymbol->type() == QgsSymbolV2::Line ) { QgsLineSymbolV2* lineSymbol = static_cast<QgsLineSymbolV2*>( tempSymbol ); lineSymbol->setWidth( sizeScale * static_cast<QgsLineSymbolV2*>( symbol )->width() ); } return tempSymbol; }
QgsSymbolV2* QgsGraduatedSymbolRendererV2::symbolForFeature( QgsFeature& feature ) { const QgsAttributes& attrs = feature.attributes(); QVariant value; if ( mAttrNum < 0 || mAttrNum >= attrs.count() ) { value = mExpression->evaluate( &feature ); } else { value = attrs[mAttrNum]; } // Null values should not be categorized if ( value.isNull() ) return NULL; // find the right category QgsSymbolV2* symbol = symbolForValue( value.toDouble() ); if ( symbol == NULL ) return NULL; if ( !mRotation.data() && !mSizeScale.data() ) return symbol; // no data-defined rotation/scaling - just return the symbol // find out rotation, size scale const double rotation = mRotation.data() ? mRotation->evaluate( feature ).toDouble() : 0; const double sizeScale = mSizeScale.data() ? mSizeScale->evaluate( feature ).toDouble() : 1.; // take a temporary symbol (or create it if doesn't exist) QgsSymbolV2* tempSymbol = mTempSymbols[symbol]; // modify the temporary symbol and return it if ( tempSymbol->type() == QgsSymbolV2::Marker ) { QgsMarkerSymbolV2* markerSymbol = static_cast<QgsMarkerSymbolV2*>( tempSymbol ); if ( mRotation.data() ) markerSymbol->setAngle( rotation ); markerSymbol->setSize( sizeScale * static_cast<QgsMarkerSymbolV2*>( symbol )->size() ); markerSymbol->setScaleMethod( mScaleMethod ); } else if ( tempSymbol->type() == QgsSymbolV2::Line ) { QgsLineSymbolV2* lineSymbol = static_cast<QgsLineSymbolV2*>( tempSymbol ); lineSymbol->setWidth( sizeScale * static_cast<QgsLineSymbolV2*>( symbol )->width() ); } return tempSymbol; }
QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForFeature( QgsFeature& feature ) { const QgsAttributeMap& attrMap = feature.attributeMap(); QgsAttributeMap::const_iterator ita = attrMap.find( mAttrNum ); if ( ita == attrMap.end() ) { QgsDebugMsg( "attribute '" + mAttrName + "' (index " + QString::number( mAttrNum ) + ") required by renderer not found" ); return NULL; } // find the right symbol for the category QgsSymbolV2* symbol = symbolForValue( *ita ); if ( symbol == NULL ) return NULL; if ( mRotationFieldIdx == -1 && mSizeScaleFieldIdx == -1 ) return symbol; // no data-defined rotation/scaling - just return the symbol // find out rotation, size scale double rotation = 0; double sizeScale = 1; if ( mRotationFieldIdx != -1 ) rotation = attrMap[mRotationFieldIdx].toDouble(); if ( mSizeScaleFieldIdx != -1 ) sizeScale = attrMap[mSizeScaleFieldIdx].toDouble(); // take a temporary symbol (or create it if doesn't exist) QgsSymbolV2* tempSymbol = mTempSymbols[ita->toString()]; // modify the temporary symbol and return it if ( tempSymbol->type() == QgsSymbolV2::Marker ) { QgsMarkerSymbolV2* markerSymbol = static_cast<QgsMarkerSymbolV2*>( tempSymbol ); if ( mRotationFieldIdx != -1 ) markerSymbol->setAngle( rotation ); if ( mSizeScaleFieldIdx != -1 ) markerSymbol->setSize( sizeScale * static_cast<QgsMarkerSymbolV2*>( symbol )->size() ); } else if ( tempSymbol->type() == QgsSymbolV2::Line ) { QgsLineSymbolV2* lineSymbol = static_cast<QgsLineSymbolV2*>( tempSymbol ); if ( mSizeScaleFieldIdx != -1 ) lineSymbol->setWidth( sizeScale * static_cast<QgsLineSymbolV2*>( symbol )->width() ); } return tempSymbol; }
void QgsRuleBasedRendererV2Widget::editRule( const QModelIndex& index ) { if ( !index.isValid() ) return; QgsRuleBasedRendererV2::Rule* rule = mModel->ruleForIndex( index ); if ( index.column() == 7 ) { QgsSymbolV2 *legendSymbol = rule->legendSymbol(); if ( legendSymbol ) { legendSymbol = legendSymbol->clone(); } else { legendSymbol = QgsSymbolV2::defaultSymbol( queryGeometryType() ); } QgsSymbolV2SelectorDialog dlg( legendSymbol, mStyle, mLayer, this ); QPushButton* deleteButton = new QPushButton( QApplication::style()->standardIcon( QStyle::SP_TrashIcon ), tr( "Delete" ) ); connect( deleteButton, SIGNAL( clicked() ), &dlg, SLOT( reject() ) ); connect( deleteButton, SIGNAL( clicked() ), this, SLOT( removeLegendSymbol() ) ); dlg.addDialogBoxButton( deleteButton, QDialogButtonBox::DestructiveRole ); if ( dlg.exec() == QDialog::Accepted ) { if ( legendSymbol ) { rule->setLegendSymbol( legendSymbol ); } mModel->updateRule( index.parent(), index.row() ); } else { delete legendSymbol; } return; } QgsRendererRulePropsDialog dlg( rule, mLayer, mStyle, this ); if ( dlg.exec() ) { // model should know about the change and emit dataChanged signal for the view mModel->updateRule( index.parent(), index.row() ); mModel->clearFeatureCounts(); } }
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; }
QList<QString> QgsCategorizedSymbolRendererV2::usedAttributes() { QgsExpression exp( mAttrName ); QSet<QString> attributes( exp.referencedColumns().toSet() ); if ( mRotation.data() ) attributes.unite( mRotation->referencedColumns().toSet() ); if ( mSizeScale.data() ) attributes.unite( mSizeScale->referencedColumns().toSet() ); QgsCategoryList::const_iterator catIt = mCategories.constBegin(); for ( ; catIt != mCategories.constEnd(); ++catIt ) { QgsSymbolV2* catSymbol = catIt->symbol(); if ( catSymbol ) { attributes.unite( catSymbol->usedAttributes() ); } } return attributes.toList(); }
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 QgsSymbolV2SelectorDialog::setSymbolFromStyle( const QModelIndex & index ) { QString symbolName = index.data( Qt::UserRole ).toString(); lblSymbolName->setText( symbolName ); // get new instance of symbol from style QgsSymbolV2* s = mStyle->symbol( symbolName ); // remove all symbol layers from original symbol while ( mSymbol->symbolLayerCount() ) mSymbol->deleteSymbolLayer( 0 ); // move all symbol layers to our symbol while ( s->symbolLayerCount() ) { QgsSymbolLayerV2* sl = s->takeSymbolLayer( 0 ); mSymbol->appendSymbolLayer( sl ); } // delete the temporary symbol delete s; updateSymbolPreview(); updateSymbolInfo(); emit symbolModified(); }