void FormWindowBase::setFeatures(Feature f) { m_d->m_feature = f; const bool enableGrid = f & GridFeature; m_d->m_grid.setVisible(enableGrid); m_d->m_grid.setSnapX(enableGrid); m_d->m_grid.setSnapY(enableGrid); emit featureChanged(f); recursiveUpdate(this); }
void QgsAtlasComposition::endRender() { if ( !mCoverageLayer ) { return; } emit featureChanged( nullptr ); updateAtlasMaps(); emit renderEnded(); }
bool QgsLayoutAtlas::prepareForFeature( const int featureI ) { if ( !mCoverageLayer ) { return false; } if ( mFeatureIds.isEmpty() ) { emit messagePushed( tr( "No matching atlas features" ) ); return false; } if ( featureI >= mFeatureIds.size() ) { return false; } mCurrentFeatureNo = featureI; // retrieve the next feature, based on its id if ( !mCoverageLayer->getFeatures( QgsFeatureRequest().setFilterFid( mFeatureIds[ featureI ].first ) ).nextFeature( mCurrentFeature ) ) return false; mLayout->reportContext().blockSignals( true ); // setFeature emits changed, we don't want 2 signals mLayout->reportContext().setLayer( mCoverageLayer.get() ); mLayout->reportContext().blockSignals( false ); mLayout->reportContext().setFeature( mCurrentFeature ); // must come after we've set the report context feature, or the expression context will have an outdated atlas feature QgsExpressionContext expressionContext = createExpressionContext(); // generate filename for current feature if ( !evalFeatureFilename( expressionContext ) ) { //error evaluating filename return false; } emit featureChanged( mCurrentFeature ); emit messagePushed( QString( tr( "Atlas feature %1 of %2" ) ).arg( featureI + 1 ).arg( mFeatureIds.size() ) ); return mCurrentFeature.isValid(); }
QgsNodeEditorModel::QgsNodeEditorModel( QgsVectorLayer* layer, QgsSelectedFeature* selectedFeature, QgsMapCanvas* canvas, QObject* parent ) : QAbstractTableModel( parent ) , mLayer( layer ) , mSelectedFeature( selectedFeature ) , mCanvas( canvas ) , mHasZ( false ) , mHasM( false ) , mHasR( true ) //always show for now - avoids scanning whole feature for curves TODO - avoid this , mZCol( -1 ) , mMCol( -1 ) , mRCol( -1 ) { if ( !mSelectedFeature->vertexMap().isEmpty() ) { mHasZ = mSelectedFeature->vertexMap().at( 0 )->point().is3D(); mHasM = mSelectedFeature->vertexMap().at( 0 )->point().isMeasure(); if ( mHasZ ) mZCol = 2; if ( mHasM ) mMCol = 2 + ( mHasZ ? 1 : 0 ); if ( mHasR ) mRCol = 2 + ( mHasZ ? 1 : 0 ) + ( mHasM ? 1 : 0 ); } QWidget* parentWidget = dynamic_cast< QWidget* >( parent ); if ( parentWidget ) { mWidgetFont = parentWidget->font(); } connect( mSelectedFeature, SIGNAL( vertexMapChanged() ), this, SLOT( featureChanged() ) ); }
bool QgsAtlasComposition::prepareForFeature( const int featureI, const bool updateMaps ) { if ( !mCoverageLayer ) { return false; } if ( mFeatureIds.isEmpty() ) { emit statusMsgChanged( tr( "No matching atlas features" ) ); return false; } if ( featureI >= mFeatureIds.size() ) { return false; } mCurrentFeatureNo = featureI; // retrieve the next feature, based on its id mCoverageLayer->getFeatures( QgsFeatureRequest().setFilterFid( mFeatureIds[ featureI ].first ) ).nextFeature( mCurrentFeature ); QgsExpressionContext expressionContext = createExpressionContext(); // generate filename for current feature if ( !evalFeatureFilename( expressionContext ) ) { //error evaluating filename return false; } mGeometryCache.clear(); emit featureChanged( &mCurrentFeature ); emit statusMsgChanged( QString( tr( "Atlas feature %1 of %2" ) ).arg( featureI + 1 ).arg( mFeatureIds.size() ) ); if ( !mCurrentFeature.isValid() ) { //bad feature return true; } if ( !updateMaps ) { //nothing more to do return true; } //update composer maps //build a list of atlas-enabled composer maps QList<QgsComposerMap*> maps; QList<QgsComposerMap*> atlasMaps; mComposition->composerItems( maps ); if ( maps.isEmpty() ) { return true; } for ( QList<QgsComposerMap*>::iterator mit = maps.begin(); mit != maps.end(); ++mit ) { QgsComposerMap* currentMap = ( *mit ); if ( !currentMap->atlasDriven() ) { continue; } atlasMaps << currentMap; } if ( !atlasMaps.isEmpty() ) { //clear the transformed bounds of the previous feature mTransformedFeatureBounds = QgsRectangle(); // compute extent of current feature in the map CRS. This should be set on a per-atlas map basis, // but given that it's not currently possible to have maps with different CRSes we can just // calculate it once based on the first atlas maps' CRS. computeExtent( atlasMaps[0] ); } for ( QList<QgsComposerMap*>::iterator mit = maps.begin(); mit != maps.end(); ++mit ) { if (( *mit )->atlasDriven() ) { // map is atlas driven, so update it's bounds (causes a redraw) prepareMap( *mit ); } else { // map is not atlas driven, so manually force a redraw (to reflect possibly atlas // dependent symbology) ( *mit )->cache(); } } return true; }
bool QgsLayoutAtlas::endRender() { emit featureChanged( QgsFeature() ); emit renderEnded(); return true; }
void QgsAtlasComposition::prepareForFeature( int featureI ) { if ( !mCoverageLayer ) { return; } if ( mFeatureIds.size() == 0 ) { emit statusMsgChanged( tr( "No matching atlas features" ) ); return; } mCurrentFeatureNo = featureI; // retrieve the next feature, based on its id mCoverageLayer->getFeatures( QgsFeatureRequest().setFilterFid( mFeatureIds[ featureI ] ) ).nextFeature( mCurrentFeature ); QgsExpression::setSpecialColumn( "$atlasfeatureid", mCurrentFeature.id() ); QgsExpression::setSpecialColumn( "$atlasgeometry", QVariant::fromValue( *mCurrentFeature.geometry() ) ); QgsExpression::setSpecialColumn( "$feature", QVariant(( int )featureI + 1 ) ); // generate filename for current feature evalFeatureFilename(); emit featureChanged( &mCurrentFeature ); // TODO - move these updates to shape/page item // update shapes (in case they use data defined symbology with atlas properties) QList<QgsComposerShape*> shapes; mComposition->composerItems( shapes ); for ( QList<QgsComposerShape*>::iterator lit = shapes.begin(); lit != shapes.end(); ++lit ) { ( *lit )->update(); } // update page background (in case it uses data defined symbology with atlas properties) QList<QgsPaperItem*> pages; mComposition->composerItems( pages ); for ( QList<QgsPaperItem*>::iterator pageIt = pages.begin(); pageIt != pages.end(); ++pageIt ) { ( *pageIt )->update(); } emit statusMsgChanged( QString( tr( "Atlas feature %1 of %2" ) ).arg( featureI + 1 ).arg( mFeatureIds.size() ) ); //update composer maps //build a list of atlas-enabled composer maps QList<QgsComposerMap*> maps; QList<QgsComposerMap*> atlasMaps; mComposition->composerItems( maps ); for ( QList<QgsComposerMap*>::iterator mit = maps.begin(); mit != maps.end(); ++mit ) { QgsComposerMap* currentMap = ( *mit ); if ( !currentMap->atlasDriven() ) { continue; } atlasMaps << currentMap; } //clear the transformed bounds of the previous feature mTransformedFeatureBounds = QgsRectangle(); if ( atlasMaps.isEmpty() ) { //no atlas enabled maps return; } // compute extent of current feature in the map CRS. This should be set on a per-atlas map basis, // but given that it's not currently possible to have maps with different CRSes we can just // calculate it once based on the first atlas maps' CRS. computeExtent( atlasMaps[0] ); //update atlas bounds of every atlas enabled composer map for ( QList<QgsComposerMap*>::iterator mit = atlasMaps.begin(); mit != atlasMaps.end(); ++mit ) { prepareMap( *mit ); } }