void QgsRelationEditorWidget::addFeature() { QgsAttributeMap keyAttrs; const QgsVectorLayerTools* vlTools = mEditorContext.vectorLayerTools(); if ( mNmRelation.isValid() ) { // n:m Relation: first let the user create a new feature on the other table // and autocreate a new linking feature. QgsFeature f; if ( vlTools->addFeature( mNmRelation.referencedLayer(), QgsAttributeMap(), QgsGeometry(), &f ) ) { QgsFeature flink( mRelation.referencingLayer()->fields() ); // Linking feature flink.setAttribute( mRelation.fieldPairs().at( 0 ).first, mFeature.attribute( mRelation.fieldPairs().at( 0 ).second ) ); flink.setAttribute( mNmRelation.referencingFields().at( 0 ), f.attribute( mNmRelation.referencedFields().at( 0 ) ) ); mRelation.referencingLayer()->addFeature( flink ); updateUi(); } } else { QgsFields fields = mRelation.referencingLayer()->fields(); Q_FOREACH ( const QgsRelation::FieldPair& fieldPair, mRelation.fieldPairs() ) { keyAttrs.insert( fields.indexFromName( fieldPair.referencingField() ), mFeature.attribute( fieldPair.referencedField() ) ); } vlTools->addFeature( mDualView->masterModel()->layer(), keyAttrs ); } }
bool QgsMapToolAddFeature::addFeature( QgsVectorLayer *vlayer, QgsFeature *f, bool showModal ) { QgsFeatureAction *action = new QgsFeatureAction( tr( "add feature" ), *f, vlayer, -1, -1, this ); bool res = action->addFeature( QgsAttributeMap(), showModal ); if ( showModal ) delete action; return res; }
bool QgsMapToolAddFeature::addFeature( QgsVectorLayer *vlayer, QgsFeature *f, bool showModal ) { QgsExpressionContextScope *scope = QgsExpressionContextUtils::mapToolCaptureScope( snappingMatches() ); QgsFeatureAction *action = new QgsFeatureAction( tr( "add feature" ), *f, vlayer, QString(), -1, this ); bool res = action->addFeature( QgsAttributeMap(), showModal, scope ); if ( showModal ) delete action; return res; }
bool QgsComposerTextTable::getFeatureAttributes( QList<QgsAttributeMap>& attributeMaps ) { attributeMaps.clear(); QList< QStringList >::const_iterator rowIt = mRowText.constBegin(); QStringList currentStringList; for ( ; rowIt != mRowText.constEnd(); ++rowIt ) { currentStringList = *rowIt; attributeMaps.push_back( QgsAttributeMap() ); for ( int i = 0; i < currentStringList.size(); ++i ) { attributeMaps.last().insert( i, QVariant( currentStringList.at( i ) ) ); } } return true; }
QgsAttributeMap QgsMergeAttributesDialog::mergedAttributesMap() const { if ( mFeatureList.size() < 1 ) { return QgsAttributeMap(); } QgsAttributeMap resultMap; for ( int i = 0; i < mTableWidget->columnCount(); i++ ) { int idx = mTableWidget->horizontalHeaderItem( i )->data( Qt::UserRole ).toInt(); QTableWidgetItem* currentItem = mTableWidget->item( mFeatureList.size() + 1, i ); if ( !currentItem ) continue; resultMap.insert( idx, currentItem->text() ); } return resultMap; }
void QgsVectorLayerUndoCommandChangeAttribute::redo() { if ( FID_IS_NEW( mFid ) ) { // updated added feature QgsFeatureMap::iterator it = mBuffer->mAddedFeatures.find( mFid ); Q_ASSERT( it != mBuffer->mAddedFeatures.end() ); it.value().setAttribute( mFieldIndex, mNewValue ); } else { // changed attribute of existing feature if ( !mBuffer->mChangedAttributeValues.contains( mFid ) ) { mBuffer->mChangedAttributeValues.insert( mFid, QgsAttributeMap() ); } mBuffer->mChangedAttributeValues[mFid].insert( mFieldIndex, mNewValue ); } emit mBuffer->attributeValueChanged( mFid, mFieldIndex, mNewValue ); }
void QgsRelationEditorWidget::addFeature() { QgsAttributeMap keyAttrs; const QgsVectorLayerTools *vlTools = mEditorContext.vectorLayerTools(); if ( mNmRelation.isValid() ) { // n:m Relation: first let the user create a new feature on the other table // and autocreate a new linking feature. QgsFeature f; if ( vlTools->addFeature( mNmRelation.referencedLayer(), QgsAttributeMap(), QgsGeometry(), &f ) ) { // Fields of the linking table const QgsFields fields = mRelation.referencingLayer()->fields(); // Expression context for the linking table QgsExpressionContext context = mRelation.referencingLayer()->createExpressionContext(); QgsAttributeMap linkAttributes; Q_FOREACH ( const QgsRelation::FieldPair &fieldPair, mRelation.fieldPairs() ) { int index = fields.indexOf( fieldPair.first ); linkAttributes.insert( index, mFeature.attribute( fieldPair.second ) ); } Q_FOREACH ( const QgsRelation::FieldPair &fieldPair, mNmRelation.fieldPairs() ) { int index = fields.indexOf( fieldPair.first ); linkAttributes.insert( index, f.attribute( fieldPair.second ) ); } QgsFeature linkFeature = QgsVectorLayerUtils::createFeature( mRelation.referencingLayer(), QgsGeometry(), linkAttributes, &context ); mRelation.referencingLayer()->addFeature( linkFeature ); updateUi(); } }
bool QgsComposerAttributeTable::getFeatureAttributes( QList<QgsAttributeMap> &attributeMaps ) { if ( !mVectorLayer ) { return false; } attributeMaps.clear(); //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 ( mVectorLayer && 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::NoGeometry ); if ( !mDisplayAttributes.isEmpty() ) req.setSubsetOfAttributes( mDisplayAttributes.toList() ); QgsFeature f; int counter = 0; QgsFeatureIterator fit = mVectorLayer->getFeatures( req ); while ( fit.nextFeature( f ) && counter < mMaximumNumberOfFeatures ) { //check feature against filter if ( activeFilter ) { QVariant result = filterExpression->evaluate( &f, mVectorLayer->pendingFields() ); // skip this feature if the filter evaluation if false if ( !result.toBool() ) { continue; } } attributeMaps.push_back( QgsAttributeMap() ); for ( int i = 0; i < f.attributes().size(); i++ ) { if ( !mDisplayAttributes.isEmpty() && !mDisplayAttributes.contains( i ) ) continue; attributeMaps.last().insert( i, f.attributes()[i] ); } ++counter; } //sort the list, starting with the last attribute QgsComposerAttributeTableCompare c; for ( int i = mSortInformation.size() - 1; i >= 0; --i ) { c.setSortColumn( mSortInformation.at( i ).first ); c.setAscending( mSortInformation.at( i ).second ); qStableSort( attributeMaps.begin(), attributeMaps.end(), c ); } return true; }
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; }