void QgsExpressionSelectionDialog::on_mActionSelectInstersect_triggered() { const QgsFeatureIds &oldSelection = mLayer->selectedFeaturesIds(); QgsFeatureIds newSelection; QgsExpression* expression = new QgsExpression( mExpressionBuilder->expressionText() ); const QgsFields fields = mLayer->fields(); expression->prepare( fields ); QgsFeature feat; foreach ( const QgsFeatureId fid, oldSelection ) { QgsFeatureIterator features = mLayer->getFeatures( QgsFeatureRequest().setFilterFid( fid ) ); if ( features.nextFeature( feat ) ) { if ( expression->evaluate( &feat, fields ).toBool() ) { newSelection << feat.id(); } } else { Q_ASSERT( false ); } features.close(); }
void QgsExpressionSelectionDialog::on_mActionAddToSelection_triggered() { QgsFeatureIds newSelection = mLayer->selectedFeaturesIds(); QgsExpression* expression = new QgsExpression( mExpressionBuilder->expressionText() ); const QgsFields fields = mLayer->fields(); QgsFeatureIterator features = mLayer->getFeatures(); expression->prepare( fields ); QgsFeature feat; while ( features.nextFeature( feat ) ) { if ( expression->evaluate( &feat, fields ).toBool() ) { newSelection << feat.id(); } } features.close(); mLayer->setSelectedFeatures( newSelection ); delete expression; saveRecent(); }
void QgsExpressionSelectionDialog::on_mActionSelectIntersect_triggered() { const QgsFeatureIds &oldSelection = mLayer->selectedFeaturesIds(); QgsFeatureIds newSelection; QgsExpression* expression = new QgsExpression( mExpressionBuilder->expressionText() ); QgsExpressionContext context; context << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() << QgsExpressionContextUtils::layerScope( mLayer ); expression->prepare( &context ); QgsFeature feat; Q_FOREACH ( const QgsFeatureId fid, oldSelection ) { QgsFeatureIterator features = mLayer->getFeatures( QgsFeatureRequest().setFilterFid( fid ) ); if ( features.nextFeature( feat ) ) { context.setFeature( feat ); if ( expression->evaluate( &context ).toBool() ) { newSelection << feat.id(); } } else { Q_ASSERT( false ); } features.close(); }
bool QgsVectorLayerLabelProvider::prepare( const QgsRenderContext &context, QSet<QString> &attributeNames ) { QgsPalLayerSettings &lyr = mSettings; const QgsMapSettings &mapSettings = mEngine->mapSettings(); QgsDebugMsgLevel( "PREPARE LAYER " + mLayerId, 4 ); if ( lyr.drawLabels ) { if ( lyr.fieldName.isEmpty() ) { return false; } if ( lyr.isExpression ) { QgsExpression exp( lyr.fieldName ); if ( exp.hasEvalError() ) { QgsDebugMsgLevel( "Prepare error:" + exp.evalErrorString(), 4 ); return false; } } else { // If we aren't an expression, we check to see if we can find the column. if ( mFields.lookupField( lyr.fieldName ) == -1 ) { return false; } } } lyr.mCurFields = mFields; if ( lyr.drawLabels || lyr.obstacle ) { if ( lyr.drawLabels ) { // add field indices for label's text, from expression or field if ( lyr.isExpression ) { // prepare expression for use in QgsPalLayerSettings::registerFeature() QgsExpression *exp = lyr.getLabelExpression(); exp->prepare( &context.expressionContext() ); if ( exp->hasEvalError() ) { QgsDebugMsgLevel( "Prepare error:" + exp->evalErrorString(), 4 ); } Q_FOREACH ( const QString &name, exp->referencedColumns() ) { QgsDebugMsgLevel( "REFERENCED COLUMN = " + name, 4 ); attributeNames.insert( name ); } } else { attributeNames.insert( lyr.fieldName ); } }
void QgsVectorLayerFeatureIterator::prepareExpressions() { const QList<QgsExpressionFieldBuffer::ExpressionField> exps = mSource->mExpressionFieldBuffer->expressions(); for ( int i = 0; i < mSource->mFields.count(); i++ ) { if ( mSource->mFields.fieldOrigin( i ) == QgsFields::OriginExpression ) { // Only prepare if there is no subset defined or the subset contains this field if ( !( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes ) || mRequest.subsetOfAttributes().contains( i ) ) { int oi = mSource->mFields.fieldOriginIndex( i ); QgsExpression* exp = new QgsExpression( exps[oi].expression ); exp->prepare( mSource->mFields ); mExpressionFieldInfo.insert( i, exp ); if ( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes ) { QgsAttributeList attrs; Q_FOREACH( const QString& col, exp->referencedColumns() ) { attrs.append( mSource->mFields.fieldNameIndex( col ) ); } mRequest.setSubsetOfAttributes( mRequest.subsetOfAttributes() + attrs ); } if ( exp->needsGeometry() ) { mRequest.setFlags( mRequest.flags() & ~QgsFeatureRequest::NoGeometry ); } } }
QgsExpression *QgsDiagram::getExpression( const QString &expression, const QgsExpressionContext &context ) { if ( !mExpressions.contains( expression ) ) { QgsExpression *expr = new QgsExpression( expression ); expr->prepare( &context ); mExpressions[expression] = expr; } return mExpressions[expression]; }
void QgsAttributeTypeDialog::defaultExpressionChanged() { QString expression = mExpressionWidget->expression(); if ( expression.isEmpty() ) { mDefaultPreviewLabel->setText( QString() ); return; } QgsExpressionContext context = mLayer->createExpressionContext(); if ( !mPreviewFeature.isValid() ) { // get first feature QgsFeatureIterator it = mLayer->getFeatures( QgsFeatureRequest().setLimit( 1 ) ); it.nextFeature( mPreviewFeature ); } context.setFeature( mPreviewFeature ); QgsExpression exp = QgsExpression( expression ); exp.prepare( &context ); if ( exp.hasParserError() ) { mDefaultPreviewLabel->setText( "<i>" + exp.parserErrorString() + "</i>" ); return; } QVariant val = exp.evaluate( &context ); if ( exp.hasEvalError() ) { mDefaultPreviewLabel->setText( "<i>" + exp.evalErrorString() + "</i>" ); return; } QString previewText = val.toString(); QgsEditorWidgetFactory *factory = QgsEditorWidgetRegistry::instance()->factory( editorWidgetType() ); if ( factory ) { previewText = factory->representValue( mLayer, mFieldIdx, editorWidgetConfig(), QVariant(), val ); } mDefaultPreviewLabel->setText( "<i>" + previewText + "</i>" ); }
bool QgsFeatureListModel::setDisplayExpression( const QString expression ) { const QgsFields fields = mFilterModel->layer()->dataProvider()->fields(); QgsExpression* exp = new QgsExpression( expression ); exp->prepare( fields ); if ( exp->hasParserError() ) { mParserErrorString = exp->parserErrorString(); delete exp; return false; } delete mExpression; mExpression = exp; emit( dataChanged( index( 0, 0 ), index( rowCount() - 1, 0 ) ) ); return true; }
bool QgsFeatureListModel::setDisplayExpression( const QString& expression ) { QgsExpression* exp = new QgsExpression( expression ); QgsExpressionContext context; context << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() << QgsExpressionContextUtils::layerScope( mFilterModel->layer() ); exp->prepare( &context ); if ( exp->hasParserError() ) { mParserErrorString = exp->parserErrorString(); delete exp; return false; } delete mExpression; mExpression = exp; emit dataChanged( index( 0, 0 ), index( rowCount() - 1, 0 ) ); return true; }
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 ); } }
QVariant QmlExpression::evaluate( const QString &expression ) const { QgsExpression exp = QgsExpression( expression ); exp.prepare( &mExpressionContext ); return exp.evaluate( &mExpressionContext ); }
void QgsAttributeTableModel::loadAttributes() { if ( !layer() ) { return; } bool ins = false, rm = false; QgsAttributeList attributes; const QgsFields& fields = layer()->pendingFields(); for ( int idx = 0; idx < fields.count(); ++idx ) { switch ( layer()->editType( idx ) ) { case QgsVectorLayer::Hidden: continue; case QgsVectorLayer::ValueMap: mValueMaps.insert( idx, new QMap< QString, QVariant >( layer()->valueMap( idx ) ) ); break; case QgsVectorLayer::ValueRelation: { const QgsVectorLayer::ValueRelationData &data = layer()->valueRelation( idx ); QgsVectorLayer *layer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( data.mLayer ) ); if ( !layer ) continue; int ki = layer->fieldNameIndex( data.mKey ); int vi = layer->fieldNameIndex( data.mValue ); QgsExpression *e = 0; if ( !data.mFilterExpression.isEmpty() ) { e = new QgsExpression( data.mFilterExpression ); if ( e->hasParserError() || !e->prepare( layer->pendingFields() ) ) continue; } if ( ki >= 0 && vi >= 0 ) { QSet<int> attributes; attributes << ki << vi; QgsFeatureRequest::Flag flags = QgsFeatureRequest::NoGeometry; if ( e ) { if ( e->needsGeometry() ) flags = QgsFeatureRequest::NoFlags; foreach ( const QString &field, e->referencedColumns() ) { int idx = layer->fieldNameIndex( field ); if ( idx < 0 ) continue; attributes << idx; } } QMap< QString, QVariant > *map = new QMap< QString, QVariant >(); QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setFlags( flags ).setSubsetOfAttributes( attributes.toList() ) ); QgsFeature f; while ( fit.nextFeature( f ) ) { if ( e && !e->evaluate( &f ).toBool() ) continue; map->insert( f.attribute( vi ).toString(), f.attribute( ki ) ); } mValueMaps.insert( idx, map ); } } break; default: break; } attributes << idx; }
bool QgsComposerAttributeTable::getFeatureAttributes( QList<QgsAttributeMap> &attributeMaps ) { if ( !mVectorLayer ) { return false; } QScopedPointer< QgsExpressionContext > context( createExpressionContext() ); context->setFields( mVectorLayer->fields() ); attributeMaps.clear(); //prepare filter expression QScopedPointer<QgsExpression> filterExpression; bool activeFilter = false; if ( mFilterFeatures && !mFeatureFilter.isEmpty() ) { filterExpression.reset( new QgsExpression( mFeatureFilter ) ); if ( !filterExpression->hasParserError() ) { activeFilter = true; } } QgsRectangle selectionRect; if ( mComposerMap && mShowOnlyVisibleFeatures ) { selectionRect = *mComposerMap->currentMapExtent(); if ( mComposition->mapSettings().hasCrsTransformEnabled() ) { //transform back to layer CRS QgsCoordinateTransform coordTransform( mVectorLayer->crs(), mComposition->mapSettings().destinationCrs() ); try { selectionRect = coordTransform.transformBoundingBox( selectionRect, QgsCoordinateTransform::ReverseTransform ); } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); return false; } } } QgsFeatureRequest req; if ( !selectionRect.isEmpty() ) req.setFilterRect( selectionRect ); req.setFlags( mShowOnlyVisibleFeatures ? QgsFeatureRequest::ExactIntersect : QgsFeatureRequest::NoFlags ); QgsFeature f; int counter = 0; QgsFeatureIterator fit = mVectorLayer->getFeatures( req ); while ( fit.nextFeature( f ) && counter < mMaximumNumberOfFeatures ) { context->setFeature( f ); //check feature against filter if ( activeFilter && !filterExpression.isNull() ) { QVariant result = filterExpression->evaluate( context.data() ); // skip this feature if the filter evaluation is false if ( !result.toBool() ) { continue; } } attributeMaps.push_back( QgsAttributeMap() ); QList<QgsComposerTableColumn*>::const_iterator columnIt = mColumns.constBegin(); int i = 0; for ( ; columnIt != mColumns.constEnd(); ++columnIt ) { int idx = mVectorLayer->fieldNameIndex(( *columnIt )->attribute() ); if ( idx != -1 ) { attributeMaps.last().insert( i, f.attributes().at( idx ) ); } else { // Lets assume it's an expression QgsExpression* expression = new QgsExpression(( *columnIt )->attribute() ); context->lastScope()->setVariable( QString( "row_number" ), counter + 1 ); expression->prepare( context.data() ); QVariant value = expression->evaluate( context.data() ); attributeMaps.last().insert( i, value.toString() ); } i++; } ++counter; } //sort the list, starting with the last attribute QgsComposerAttributeTableCompare c; QList< QPair<int, bool> > sortColumns = sortAttributes(); for ( int i = sortColumns.size() - 1; i >= 0; --i ) { c.setSortColumn( sortColumns.at( i ).first ); c.setAscending( sortColumns.at( i ).second ); qStableSort( attributeMaps.begin(), attributeMaps.end(), c ); } adjustFrameToSize(); return true; }
bool QgsComposerAttributeTableV2::getTableContents( QgsComposerTableContents &contents ) { contents.clear(); if (( mSource == QgsComposerAttributeTableV2::AtlasFeature || mSource == QgsComposerAttributeTableV2::RelationChildren ) && !mComposition->atlasComposition().enabled() ) { //source mode requires atlas, but atlas disabled return false; } QgsVectorLayer* layer = sourceLayer(); if ( !layer ) { //no source layer return false; } //prepare filter expression std::auto_ptr<QgsExpression> filterExpression; bool activeFilter = false; if ( mFilterFeatures && !mFeatureFilter.isEmpty() ) { filterExpression = std::auto_ptr<QgsExpression>( new QgsExpression( mFeatureFilter ) ); if ( !filterExpression->hasParserError() ) { activeFilter = true; } } QgsRectangle selectionRect; if ( mComposerMap && mShowOnlyVisibleFeatures ) { selectionRect = *mComposerMap->currentMapExtent(); if ( layer && mComposition->mapSettings().hasCrsTransformEnabled() ) { //transform back to layer CRS QgsCoordinateTransform coordTransform( layer->crs(), mComposition->mapSettings().destinationCrs() ); try { selectionRect = coordTransform.transformBoundingBox( selectionRect, QgsCoordinateTransform::ReverseTransform ); } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); return false; } } } QgsFeatureRequest req; if ( mSource == QgsComposerAttributeTableV2::RelationChildren ) { QgsRelation relation = QgsProject::instance()->relationManager()->relation( mRelationId ); QgsFeature* atlasFeature = mComposition->atlasComposition().currentFeature(); if ( atlasFeature ) { req = relation.getRelatedFeaturesRequest( *atlasFeature ); } else { //no atlas feature, so empty table return true; } } if ( !selectionRect.isEmpty() ) req.setFilterRect( selectionRect ); req.setFlags( mShowOnlyVisibleFeatures ? QgsFeatureRequest::ExactIntersect : QgsFeatureRequest::NoFlags ); if ( mSource == QgsComposerAttributeTableV2::AtlasFeature && mComposition->atlasComposition().enabled() ) { //source mode is current atlas feature QgsFeature* atlasFeature = mComposition->atlasComposition().currentFeature(); if ( atlasFeature ) { req.setFilterFid( atlasFeature->id() ); } else { //no atlas feature, so empty table return true; } } QgsFeature f; int counter = 0; QgsFeatureIterator fit = layer->getFeatures( req ); while ( fit.nextFeature( f ) && counter < mMaximumNumberOfFeatures ) { //check feature against filter if ( activeFilter ) { QVariant result = filterExpression->evaluate( &f, layer->pendingFields() ); // skip this feature if the filter evaluation is false if ( !result.toBool() ) { continue; } } //check against atlas feature intersection if ( mFilterToAtlasIntersection ) { if ( !f.geometry() || ! mComposition->atlasComposition().enabled() ) { continue; } QgsFeature* atlasFeature = mComposition->atlasComposition().currentFeature(); if ( !atlasFeature || !atlasFeature->geometry() || !f.geometry()->intersects( atlasFeature->geometry() ) ) { //feature falls outside current atlas feature continue; } } QgsComposerTableRow currentRow; QList<QgsComposerTableColumn*>::const_iterator columnIt = mColumns.constBegin(); for ( ; columnIt != mColumns.constEnd(); ++columnIt ) { int idx = layer->fieldNameIndex(( *columnIt )->attribute() ); if ( idx != -1 ) { currentRow << f.attributes()[idx]; } else { // Lets assume it's an expression QgsExpression* expression = new QgsExpression(( *columnIt )->attribute() ); expression->setCurrentRowNumber( counter + 1 ); expression->prepare( layer->pendingFields() ); QVariant value = expression->evaluate( f ) ; currentRow << value; } } if ( !mShowUniqueRowsOnly || !contentsContainsRow( contents, currentRow ) ) { contents << currentRow; ++counter; } } //sort the list, starting with the last attribute QgsComposerAttributeTableCompareV2 c; QList< QPair<int, bool> > sortColumns = sortAttributes(); for ( int i = sortColumns.size() - 1; i >= 0; --i ) { c.setSortColumn( sortColumns.at( i ).first ); c.setAscending( sortColumns.at( i ).second ); qStableSort( contents.begin(), contents.end(), c ); } recalculateTableSize(); return true; }