QString QgsMapToolLabel::dataDefinedColumnName( QgsPalLayerSettings::Property p, const QgsPalLayerSettings &labelSettings ) const { if ( !labelSettings.dataDefinedProperties().isActive( p ) ) return QString(); QgsProperty prop = labelSettings.dataDefinedProperties().property( p ); if ( prop.propertyType() != QgsProperty::FieldBasedProperty ) return QString(); return prop.field(); }
int QgsAuxiliaryLayer::createProperty( QgsPalLayerSettings::Property property, QgsVectorLayer *layer ) { int index = -1; if ( layer && layer->labeling() && layer->auxiliaryLayer() ) { // property definition are identical whatever the provider id const QgsPropertyDefinition def = layer->labeling()->settings().propertyDefinitions()[property]; const QString fieldName = nameFromProperty( def, true ); layer->auxiliaryLayer()->addAuxiliaryField( def ); if ( layer->auxiliaryLayer()->indexOfPropertyDefinition( def ) >= 0 ) { const QgsProperty prop = QgsProperty::fromField( fieldName ); for ( const QString &providerId : layer->labeling()->subProviders() ) { QgsPalLayerSettings *settings = new QgsPalLayerSettings( layer->labeling()->settings( providerId ) ); QgsPropertyCollection c = settings->dataDefinedProperties(); c.setProperty( property, prop ); settings->setDataDefinedProperties( c ); layer->labeling()->setSettings( settings, providerId ); } emit layer->styleChanged(); } index = layer->fields().lookupField( fieldName ); } return index; }
void QgsDwgImportDialog::createGroup( QgsLayerTreeGroup *group, const QString &name, const QStringList &layers, bool visible ) { QgsLayerTreeGroup *layerGroup = group->addGroup( name ); QgsDebugMsg( QStringLiteral( " %1" ).arg( name ) ) ; Q_ASSERT( layerGroup ); QString layerFilter; if ( !layers.isEmpty() ) { QStringList exprlist; const auto constLayers = layers; for ( QString layer : constLayers ) { exprlist.append( QStringLiteral( "'%1'" ).arg( layer.replace( QLatin1String( "'" ), QLatin1String( "''" ) ) ) ); } layerFilter = QStringLiteral( "layer IN (%1) AND " ).arg( exprlist.join( QStringLiteral( "," ) ) ); } QgsVectorLayer *l = nullptr; QgsSymbol *sym = nullptr; l = layer( layerGroup, layerFilter, QStringLiteral( "hatches" ) ); if ( l ) { QgsSimpleFillSymbolLayer *sfl = new QgsSimpleFillSymbolLayer(); sfl->setDataDefinedProperty( QgsSymbolLayer::PropertyFillColor, QgsProperty::fromField( QStringLiteral( "color" ) ) ); sfl->setStrokeStyle( Qt::NoPen ); sym = new QgsFillSymbol(); sym->changeSymbolLayer( 0, sfl ); l->setRenderer( new QgsSingleSymbolRenderer( sym ) ); } l = layer( layerGroup, layerFilter, QStringLiteral( "lines" ) ); if ( l ) { QgsSimpleLineSymbolLayer *sll = new QgsSimpleLineSymbolLayer(); sll->setDataDefinedProperty( QgsSymbolLayer::PropertyStrokeColor, QgsProperty::fromField( QStringLiteral( "color" ) ) ); sll->setPenJoinStyle( Qt::MiterJoin ); sll->setDataDefinedProperty( QgsSymbolLayer::PropertyStrokeWidth, QgsProperty::fromField( QStringLiteral( "linewidth" ) ) ); // sll->setUseCustomDashPattern( true ); // sll->setCustomDashPatternUnit( QgsSymbolV2::MapUnit ); // sll->setDataDefinedProperty( QgsSymbolLayer::PropertyCustomDash, QgsProperty::fromField( "linetype" ) ); sym = new QgsLineSymbol(); sym->changeSymbolLayer( 0, sll ); sym->setOutputUnit( QgsUnitTypes::RenderMillimeters ); l->setRenderer( new QgsSingleSymbolRenderer( sym ) ); } l = layer( layerGroup, layerFilter, QStringLiteral( "polylines" ) ); if ( l ) { sym = new QgsLineSymbol(); QgsSimpleLineSymbolLayer *sll = new QgsSimpleLineSymbolLayer(); sll->setDataDefinedProperty( QgsSymbolLayer::PropertyStrokeColor, QgsProperty::fromField( QStringLiteral( "color" ) ) ); sll->setPenJoinStyle( Qt::MiterJoin ); sll->setDataDefinedProperty( QgsSymbolLayer::PropertyStrokeWidth, QgsProperty::fromField( QStringLiteral( "width" ) ) ); sll->setDataDefinedProperty( QgsSymbolLayer::PropertyLayerEnabled, QgsProperty::fromExpression( QStringLiteral( "width>0" ) ) ); sll->setOutputUnit( QgsUnitTypes::RenderMapUnits ); // sll->setUseCustomDashPattern( true ); // sll->setCustomDashPatternUnit( QgsSymbolV2::MapUnit ); // sll->setDataDefinedProperty( QgsSymbolLayer::PropertyCustomDash, QgsProperty::fromField( "linetype" ) ); sym->changeSymbolLayer( 0, sll ); sll = new QgsSimpleLineSymbolLayer(); sll->setDataDefinedProperty( QgsSymbolLayer::PropertyStrokeColor, QgsProperty::fromField( QStringLiteral( "color" ) ) ); sll->setPenJoinStyle( Qt::MiterJoin ); sll->setDataDefinedProperty( QgsSymbolLayer::PropertyStrokeWidth, QgsProperty::fromField( QStringLiteral( "linewidth" ) ) ); sll->setDataDefinedProperty( QgsSymbolLayer::PropertyLayerEnabled, QgsProperty::fromExpression( QStringLiteral( "width=0" ) ) ); sll->setOutputUnit( QgsUnitTypes::RenderMillimeters ); sym->appendSymbolLayer( sll ); l->setRenderer( new QgsSingleSymbolRenderer( sym ) ); } l = layer( layerGroup, layerFilter, QStringLiteral( "texts" ) ); if ( l ) { l->setRenderer( new QgsNullSymbolRenderer() ); QgsTextFormat tf; tf.setSizeUnit( QgsUnitTypes::RenderMapUnits ); QgsPalLayerSettings pls; pls.setFormat( tf ); pls.drawLabels = true; pls.fieldName = QStringLiteral( "text" ); pls.wrapChar = QStringLiteral( "\\P" ); pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::Size, QgsProperty::fromField( QStringLiteral( "height" ) ) ); pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::Color, QgsProperty::fromField( QStringLiteral( "color" ) ) ); pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::MultiLineHeight, QgsProperty::fromExpression( QStringLiteral( "CASE WHEN interlin<0 THEN 1 ELSE interlin*1.5 END" ) ) ); pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::PositionX, QgsProperty::fromExpression( QStringLiteral( "$x" ) ) ); pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::PositionY, QgsProperty::fromExpression( QStringLiteral( "$y" ) ) ); // DXF TEXT // vertical: 0 = Base, 1 = Bottom, 2 = Middle, 3 = Top, default Base // horizontal: 0 = Left, 1 = Center, 2 = Right, 3 = Aligned (if Base), 4 = Middle (if Base), default Left // DXF MTEXT // 1 = Top left; 2 = Top center; 3 = Top right // 4 = Middle left; 5 = Middle center; 6 = Middle right // 7 = Bottom left; 8 = Bottom center; 9 = Bottom right // QGIS Quadrant // 0 QuadrantAboveLeft, 1 QuadrantAbove, 2 QuadrantAboveRight, // 3 QuadrantLeft, 4 QuadrantOver, 5 QuadrantRight, // 6 QuadrantBelowLeft, 7 QuadrantBelow, 8 QuadrantBelowRight, pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::Hali, QgsProperty::fromExpression( QStringLiteral( "CASE" " WHEN etype=%1 THEN" " CASE" " WHEN textgen % 3=2 THEN 'Center'" " WHEN textgen % 3=0 THEN 'Right'" " ELSE 'Left'" " END" " ELSE" " CASE" " WHEN alignh=1 THEN 'Center'" " WHEN alignh=2 THEN 'Right'" " ELSE 'Left'" " END" " END" ).arg( DRW::MTEXT ) ) ); pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::Vali, QgsProperty::fromExpression( QStringLiteral( "CASE" " WHEN etype=%1 THEN" " CASE" " WHEN textgen<4 THEN 'Top'" " WHEN textgen<7 THEN 'Half'" " ELSE 'Bottom'" " END" " ELSE" " CASE" " WHEN alignv=1 THEN 'Bottom'" " WHEN alignv=2 THEN 'Half'" " WHEN alignv=3 THEN 'Top'" " ELSE 'Base'" " END" " END" ).arg( DRW::MTEXT ) ) ); pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::LabelRotation, QgsProperty::fromExpression( QStringLiteral( "360-angle" ) ) ); pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::AlwaysShow, QgsProperty::fromExpression( QStringLiteral( "1" ) ) ); l->setLabeling( new QgsVectorLayerSimpleLabeling( pls ) ); l->setLabelsEnabled( true ); } l = layer( layerGroup, layerFilter, QStringLiteral( "points" ) ); if ( l ) { // FIXME: use PDMODE? l->setRenderer( new QgsNullSymbolRenderer() ); } if ( !cbExpandInserts->isChecked() ) layer( layerGroup, layerFilter, QStringLiteral( "inserts" ) ); if ( !layerGroup->children().isEmpty() ) { layerGroup->setExpanded( false ); layerGroup->setItemVisibilityChecked( visible ); } else { layerGroup->parent()->takeChild( layerGroup ); delete layerGroup; } }
void QgsLabelPropertyDialog::init( const QString &layerId, const QString &providerId, int featureId, const QString &labelText ) { //get feature attributes QgsVectorLayer *vlayer = QgsProject::instance()->mapLayer<QgsVectorLayer *>( layerId ); if ( !vlayer ) { return; } if ( !vlayer->labeling() ) { return; } if ( !vlayer->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( mCurLabelFeat ) ) { return; } QgsAttributes attributeValues = mCurLabelFeat.attributes(); //get layerproperties. Problem: only for pallabeling... blockElementSignals( true ); QgsPalLayerSettings layerSettings = vlayer->labeling()->settings( providerId ); //get label field and fill line edit if ( layerSettings.isExpression && !labelText.isNull() ) { mLabelTextLineEdit->setText( labelText ); mLabelTextLineEdit->setEnabled( false ); mLabelTextLabel->setText( tr( "Expression result" ) ); } else { QString labelFieldName = layerSettings.fieldName; if ( !labelFieldName.isEmpty() ) { mCurLabelField = vlayer->fields().lookupField( labelFieldName ); if ( mCurLabelField >= 0 ) { mLabelTextLineEdit->setText( attributeValues.at( mCurLabelField ).toString() ); if ( vlayer->isEditable() ) mLabelTextLineEdit->setEnabled( true ); else mLabelTextLineEdit->setEnabled( false ); const QgsFields &layerFields = vlayer->fields(); switch ( layerFields.at( mCurLabelField ).type() ) { case QVariant::Double: mLabelTextLineEdit->setValidator( new QDoubleValidator( this ) ); break; case QVariant::Int: case QVariant::UInt: case QVariant::LongLong: mLabelTextLineEdit->setValidator( new QIntValidator( this ) ); break; default: break; } } else { mLabelTextLineEdit->setEnabled( false ); } } } //get attributes of the feature and fill data defined values // font is set directly from QgsLabelPosition updateFont( mLabelFont, false ); QgsTextFormat format = layerSettings.format(); QgsTextBufferSettings buffer = format.buffer(); //set all the gui elements to the default layer-level values mLabelDistanceSpinBox->clear(); mLabelDistanceSpinBox->setSpecialValueText( tr( "Layer default (%1)" ).arg( QString::number( layerSettings.dist, 'f', mLabelDistanceSpinBox->decimals() ) ) ); mBufferSizeSpinBox->clear(); mBufferSizeSpinBox->setSpecialValueText( tr( "Layer default (%1)" ).arg( QString::number( buffer.size(), 'f', mBufferSizeSpinBox->decimals() ) ) ); mRotationSpinBox->clear(); mXCoordSpinBox->clear(); mYCoordSpinBox->clear(); mShowLabelChkbx->setChecked( true ); mFontColorButton->setColor( format.color() ); mBufferColorButton->setColor( buffer.color() ); mMinScaleWidget->setScale( layerSettings.minimumScale ); mMaxScaleWidget->setScale( layerSettings.maximumScale ); mHaliComboBox->setCurrentIndex( mHaliComboBox->findData( "Left" ) ); mValiComboBox->setCurrentIndex( mValiComboBox->findData( "Bottom" ) ); mFontColorButton->setColorDialogTitle( tr( "Font Color" ) ); mBufferColorButton->setColorDialogTitle( tr( "Buffer Color" ) ); disableGuiElements(); mDataDefinedProperties = layerSettings.dataDefinedProperties(); //set widget values from data defined results setDataDefinedValues( vlayer ); //enable widgets connected to data defined fields enableDataDefinedWidgets( vlayer ); blockElementSignals( false ); }