void Qgs25DRenderer::startRender( QgsRenderContext& context, const QgsFields& fields ) { QgsExpressionContextScope* scope = new QgsExpressionContextScope( "2.5D Renderer" ); scope->setVariable( "qgis_25d_height", mHeight.expressionOrField() ); scope->setVariable( "qgis_25d_angle", mAngle ); context.expressionContext().appendScope( scope ); mSymbol->startRender( context, &fields ); }
QgsExpressionContextScope *QgsExpressionContextUtils::composerItemScope( const QgsComposerItem *composerItem ) { QgsExpressionContextScope* scope = new QgsExpressionContextScope( QObject::tr( "Composer Item" ) ); if ( !composerItem ) return scope; //add variables defined in composer item properties QStringList variableNames = composerItem->customProperty( "variableNames" ).toStringList(); QStringList variableValues = composerItem->customProperty( "variableValues" ).toStringList(); int varIndex = 0; Q_FOREACH ( const QString& variableName, variableNames ) { if ( varIndex >= variableValues.length() ) { break; } QVariant varValue = variableValues.at( varIndex ); varIndex++; scope->setVariable( variableName, varValue ); } //add known composer item context variables scope->addVariable( QgsExpressionContextScope::StaticVariable( "item_id", composerItem->id(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "item_uuid", composerItem->uuid(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "layout_page", composerItem->page(), true ) ); return scope; }
QgsExpressionContextScope *QgsExpressionContextUtils::compositionScope( const QgsComposition *composition ) { QgsExpressionContextScope* scope = new QgsExpressionContextScope( QObject::tr( "Composition" ) ); if ( !composition ) return scope; //add variables defined in composition properties QStringList variableNames = composition->customProperty( "variableNames" ).toStringList(); QStringList variableValues = composition->customProperty( "variableValues" ).toStringList(); int varIndex = 0; Q_FOREACH ( const QString& variableName, variableNames ) { if ( varIndex >= variableValues.length() ) { break; } QVariant varValue = variableValues.at( varIndex ); varIndex++; scope->setVariable( variableName, varValue ); } //add known composition context variables scope->addVariable( QgsExpressionContextScope::StaticVariable( "layout_numpages", composition->numPages(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "layout_pageheight", composition->paperHeight(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "layout_pagewidth", composition->paperWidth(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "layout_dpi", composition->printResolution(), true ) ); return scope; }
QgsExpressionContextScope* QgsExpressionContextUtils::projectScope() { QgsProject* project = QgsProject::instance(); QgsExpressionContextScope* scope = new QgsExpressionContextScope( QObject::tr( "Project" ) ); //add variables defined in project file QStringList variableNames = project->readListEntry( "Variables", "/variableNames" ); QStringList variableValues = project->readListEntry( "Variables", "/variableValues" ); int varIndex = 0; Q_FOREACH ( const QString& variableName, variableNames ) { if ( varIndex >= variableValues.length() ) { break; } QString varValueString = variableValues.at( varIndex ); varIndex++; scope->setVariable( variableName, varValueString ); } //add other known project variables scope->addVariable( QgsExpressionContextScope::StaticVariable( "project_title", project->title(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "project_path", project->fileInfo().filePath(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "project_folder", project->fileInfo().dir().path(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "project_filename", project->fileInfo().fileName(), true ) ); scope->addFunction( "project_color", new GetNamedProjectColor() ); return scope; }
QgsExpressionContextScope* QgsExpressionContextUtils::projectScope( const QgsProject* project ) { QgsExpressionContextScope* scope = new QgsExpressionContextScope( QObject::tr( "Project" ) ); if ( !project ) return scope; const QVariantMap vars = project->customVariables(); QVariantMap::const_iterator it = vars.constBegin(); for ( ; it != vars.constEnd(); ++it ) { scope->setVariable( it.key(), it.value() ); } //add other known project variables scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "project_title" ), project->title(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "project_path" ), project->fileInfo().filePath(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "project_folder" ), project->fileInfo().dir().path(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "project_filename" ), project->fileInfo().fileName(), true ) ); QgsCoordinateReferenceSystem projectCrs = project->crs(); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "project_crs" ), projectCrs.authid(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "project_crs_definition" ), projectCrs.toProj4(), true ) ); scope->addFunction( QStringLiteral( "project_color" ), new GetNamedProjectColor() ); return scope; }
void QgsActionManager::doAction( int index, const QgsFeature& feat, int defaultValueIndex ) { QgsExpressionContext context = createExpressionContext(); QgsExpressionContextScope* actionScope = new QgsExpressionContextScope(); actionScope->setVariable( "current_field", feat.attribute( defaultValueIndex ) ); context << actionScope; doAction( index, feat, context ); }
QgsExpressionContextScope* QgsExpressionContextUtils::globalScope() { QgsExpressionContextScope* scope = new QgsExpressionContextScope( QObject::tr( "Global" ) ); //read values from QSettings QSettings settings; //check if settings contains any variables if ( settings.contains( QString( "/variables/values" ) ) ) { QList< QVariant > customVariableVariants = settings.value( QString( "/variables/values" ) ).toList(); QList< QVariant > customVariableNames = settings.value( QString( "/variables/names" ) ).toList(); int variableIndex = 0; for ( QList< QVariant >::const_iterator it = customVariableVariants.constBegin(); it != customVariableVariants.constEnd(); ++it ) { if ( variableIndex >= customVariableNames.length() ) { break; } QVariant value = ( *it ); QString name = customVariableNames.at( variableIndex ).toString(); scope->setVariable( name, value ); variableIndex++; } } //add some extra global variables scope->addVariable( QgsExpressionContextScope::StaticVariable( "qgis_version", QGis::QGIS_VERSION, true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "qgis_version_no", QGis::QGIS_VERSION_INT, true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "qgis_release_name", QGis::QGIS_RELEASE_NAME, true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "qgis_platform", QgsApplication::platform(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "qgis_os_name", QgsApplication::osName(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "user_account_name", QgsApplication::userLoginName(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( "user_full_name", QgsApplication::userFullName(), true ) ); return scope; }
QgsExpressionContextScope* QgsExpressionContextUtils::layerScope( const QgsMapLayer* layer ) { QgsExpressionContextScope* scope = new QgsExpressionContextScope( QObject::tr( "Layer" ) ); if ( !layer ) return scope; //add variables defined in layer properties QStringList variableNames = layer->customProperty( QStringLiteral( "variableNames" ) ).toStringList(); QStringList variableValues = layer->customProperty( QStringLiteral( "variableValues" ) ).toStringList(); int varIndex = 0; Q_FOREACH ( const QString& variableName, variableNames ) { if ( varIndex >= variableValues.length() ) { break; } QVariant varValue = variableValues.at( varIndex ); varIndex++; scope->setVariable( variableName, varValue ); } scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "layer_name" ), layer->name(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "layer_id" ), layer->id(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "layer" ), QVariant::fromValue<QPointer<QgsMapLayer> >( QPointer<QgsMapLayer>( const_cast<QgsMapLayer*>( layer ) ) ), true ) ); const QgsVectorLayer* vLayer = dynamic_cast< const QgsVectorLayer* >( layer ); if ( vLayer ) { scope->setFields( vLayer->fields() ); } //TODO - add functions. Possibilities include: //is_selected //field summary stats return scope; }
QgsExpressionContextScope* QgsExpressionContextUtils::globalScope() { QgsExpressionContextScope* scope = new QgsExpressionContextScope( QObject::tr( "Global" ) ); QVariantMap customVariables = QgsApplication::customVariables(); for ( QVariantMap::const_iterator it = customVariables.constBegin(); it != customVariables.constEnd(); ++it ) { scope->setVariable( it.key(), it.value() ); } //add some extra global variables scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "qgis_version" ), Qgis::QGIS_VERSION, true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "qgis_version_no" ), Qgis::QGIS_VERSION_INT, true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "qgis_release_name" ), Qgis::QGIS_RELEASE_NAME, true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "qgis_platform" ), QgsApplication::platform(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "qgis_os_name" ), QgsApplication::osName(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "user_account_name" ), QgsApplication::userLoginName(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "user_full_name" ), QgsApplication::userFullName(), true ) ); return scope; }
bool QgsMapToolFeatureAction::doAction( QgsVectorLayer *layer, int x, int y ) { if ( !layer ) return false; QgsPoint point = mCanvas->getCoordinateTransform()->toMapCoordinates( x, y ); QgsFeatureList featList; // toLayerCoordinates will throw an exception for an 'invalid' point. // For example, if you project a world map onto a globe using EPSG 2163 // and then click somewhere off the globe, an exception will be thrown. try { // create the search rectangle double searchRadius = searchRadiusMU( mCanvas ); QgsRectangle r; r.setXMinimum( point.x() - searchRadius ); r.setXMaximum( point.x() + searchRadius ); r.setYMinimum( point.y() - searchRadius ); r.setYMaximum( point.y() + searchRadius ); r = toLayerCoordinates( layer, r ); QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setFilterRect( r ).setFlags( QgsFeatureRequest::ExactIntersect ) ); QgsFeature f; while ( fit.nextFeature( f ) ) featList << QgsFeature( f ); } catch ( QgsCsException & cse ) { Q_UNUSED( cse ); // catch exception for 'invalid' point and proceed with no features found QgsDebugMsg( QString( "Caught CRS exception %1" ).arg( cse.what() ) ); } if ( featList.isEmpty() ) return false; Q_FOREACH ( const QgsFeature& feat, featList ) { if ( layer->actions()->defaultAction() >= 0 ) { // define custom substitutions: layer id and clicked coords QgsExpressionContext context; context << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() << QgsExpressionContextUtils::mapSettingsScope( mCanvas->mapSettings() ); QgsExpressionContextScope* actionScope = new QgsExpressionContextScope(); actionScope->setVariable( "click_x", point.x() ); actionScope->setVariable( "click_y", point.y() ); context << actionScope; int actionIdx = layer->actions()->defaultAction(); layer->actions()->doAction( actionIdx, feat, context ); } else { QgsMapLayerAction* mapLayerAction = QgsMapLayerActionRegistry::instance()->defaultActionForLayer( layer ); if ( mapLayerAction ) { mapLayerAction->triggerForFeature( layer, &feat ); } } } return true; }