bool QgsSymbolLayerV2::hasDataDefinedProperty( const QString& property ) const { if ( mDataDefinedProperties.isEmpty() ) return false; QgsDataDefined* dd = getDataDefinedProperty( property ); return dd && dd->isActive(); }
void QgsEllipseSymbolLayerV2::writeSldMarker( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const { // <Graphic> QDomElement graphicElem = doc.createElement( "se:Graphic" ); element.appendChild( graphicElem ); QgsSymbolLayerV2Utils::wellKnownMarkerToSld( doc, graphicElem, mSymbolName, mFillColor, mOutlineColor, mOutlineStyle, mOutlineWidth, mSymbolWidth ); // store w/h factor in a <VendorOption> double widthHeightFactor = mSymbolWidth / mSymbolHeight; QDomElement factorElem = QgsSymbolLayerV2Utils::createVendorOptionElement( doc, "widthHeightFactor", QString::number( widthHeightFactor ) ); graphicElem.appendChild( factorElem ); // <Rotation> QgsDataDefined* ddRotation = getDataDefinedProperty( QgsSymbolLayerV2::EXPR_ROTATION ); QString angleFunc = props.value( "angle", "" ); if ( angleFunc.isEmpty() ) // symbol has no angle set { if ( ddRotation && ddRotation->isActive() ) { angleFunc = ddRotation->useExpression() ? ddRotation->expressionString() : ddRotation->field(); } else if ( !qgsDoubleNear( mAngle, 0.0 ) ) angleFunc = QString::number( mAngle ); } else if ( ddRotation && ddRotation->isActive() ) { // the symbol has an angle and the symbol layer have a rotation // property set angleFunc = QString( "%1 + %2" ).arg( angleFunc ).arg( ddRotation->useExpression() ? ddRotation->expressionString() : ddRotation->field() ); } else if ( !qgsDoubleNear( mAngle, 0.0 ) ) { // both the symbol and the symbol layer have angle value set bool ok; double angle = angleFunc.toDouble( &ok ); if ( !ok ) { // its a string (probably a property name or a function) angleFunc = QString( "%1 + %2" ).arg( angleFunc ).arg( mAngle ); } else if ( !qgsDoubleNear( angle + mAngle, 0.0 ) ) { // it's a double value angleFunc = QString::number( angle + mAngle ); } } QgsSymbolLayerV2Utils::createRotationElement( doc, graphicElem, angleFunc ); }
QVariant QgsSymbolLayerV2::evaluateDataDefinedProperty( const QString &property, const QgsFeature* feature, const QVariant& defaultVal, bool *ok ) const { if ( ok ) *ok = false; QgsDataDefined* dd = getDataDefinedProperty( property ); if ( !dd || !dd->isActive() ) return defaultVal; if ( dd->useExpression() ) { if ( dd->expression() ) { QgsExpressionContext context = feature ? QgsExpressionContextUtils::createFeatureBasedContext( *feature, QgsFields() ) : QgsExpressionContext(); QVariant result = dd->expression()->evaluate( &context ); if ( result.isValid() ) { if ( ok ) *ok = true; return result; } else return defaultVal; } else { return defaultVal; } } else if ( feature && !dd->field().isEmpty() && !mFields.isEmpty() ) { int attributeIndex = mFields.fieldNameIndex( dd->field() ); if ( attributeIndex >= 0 ) { if ( ok ) *ok = true; return feature->attribute( attributeIndex ); } } return defaultVal; }
QVariant QgsSymbolLayerV2::evaluateDataDefinedProperty( const QString& property, const QgsSymbolV2RenderContext& context, const QVariant& defaultVal, bool* ok ) const { if ( ok ) *ok = false; QgsDataDefined* dd = getDataDefinedProperty( property ); if ( !dd || !dd->isActive() ) return defaultVal; if ( dd->useExpression() ) { if ( dd->expression() ) { QVariant result = dd->expression()->evaluate( &context.renderContext().expressionContext() ); if ( result.isValid() ) { if ( ok ) *ok = true; return result; } else return defaultVal; } else { return defaultVal; } } else if ( context.feature() && !dd->field().isEmpty() && !mFields.isEmpty() ) { int attributeIndex = mFields.fieldNameIndex( dd->field() ); if ( attributeIndex >= 0 ) { if ( ok ) *ok = true; return context.feature()->attribute( attributeIndex ); } } return defaultVal; }
QString QgsSymbolLayerV2::dataDefinedPropertyString( const QString& property ) const { const QgsDataDefined* dd = getDataDefinedProperty( property ); return dd ? dd->expressionString() : QString(); }
QgsExpression* QgsSymbolLayerV2::expression( const QString& property ) const { QgsDataDefined* dd = getDataDefinedProperty( property ); return dd ? dd->expression() : nullptr; }