QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::createFromSld( QDomElement &element ) { QgsDebugMsg( "Entered." ); QDomElement graphicElem = element.firstChildElement( "Graphic" ); if ( graphicElem.isNull() ) return NULL; QString name = "square"; QColor color, borderColor; double borderWidth, size; if ( !QgsSymbolLayerV2Utils::wellKnownMarkerFromSld( graphicElem, name, color, borderColor, borderWidth, size ) ) return NULL; double angle = 0.0; QString angleFunc; if ( QgsSymbolLayerV2Utils::rotationFromSldElement( graphicElem, angleFunc ) ) { bool ok; double d = angleFunc.toDouble( &ok ); if ( ok ) angle = d; } QPointF offset; QgsSymbolLayerV2Utils::displacementFromSldElement( graphicElem, offset ); QgsMarkerSymbolLayerV2 *m = new QgsSimpleMarkerSymbolLayerV2( name, color, borderColor, size ); m->setAngle( angle ); m->setOffset( offset ); return m; }
void QgsMarkerSymbolV2::setScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod ) { for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) { QgsMarkerSymbolLayerV2* layer = static_cast<QgsMarkerSymbolLayerV2*>( *it ); layer->setScaleMethod( scaleMethod ); } }
void QgsMarkerSymbolV2::setLineAngle( double lineAng ) { for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) { QgsMarkerSymbolLayerV2* layer = ( QgsMarkerSymbolLayerV2* ) * it; layer->setLineAngle( lineAng ); } }
void QgsMarkerSymbolV2::setAngle( double ang ) { double origAngle = angle(); double angleDiff = ang - origAngle; for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) { QgsMarkerSymbolLayerV2* layer = ( QgsMarkerSymbolLayerV2* ) * it; layer->setAngle( layer->angle() + angleDiff ); } }
void QgsDxfExport::writeBlocks() { startSection(); writeGroup( 2, "BLOCKS" ); //iterate through all layers and get symbol layer pointers QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2* > > slList; if ( mSymbologyExport != NoSymbology ) { slList = symbolLayers(); } QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2* > >::const_iterator slIt = slList.constBegin(); for ( ; slIt != slList.constEnd(); ++slIt ) { QgsMarkerSymbolLayerV2* ml = dynamic_cast< QgsMarkerSymbolLayerV2*>( slIt->first ); if ( ml ) { //if point symbol layer and no data defined properties: write block QgsRenderContext ct; QgsSymbolV2RenderContext ctx( ct, QgsSymbolV2::MapUnit, slIt->second->alpha(), false, slIt->second->renderHints(), 0 ); ml->startRender( ctx ); //markers with data defined properties are inserted inline if ( hasDataDefinedProperties( ml, slIt->second ) ) { continue; // ml->stopRender( ctx ); } writeGroup( 0, "BLOCK" ); writeGroup( 8, 0 ); QString blockName = QString( "symbolLayer%1" ).arg( mBlockCounter++ ); writeGroup( 2, blockName ); writeGroup( 70, 64 ); //x/y/z coordinates of reference point //todo: consider anchor point // double size = ml->size(); // size *= mapUnitScaleFactor( mSymbologyScaleDenominator, ml->sizeUnit(), mMapUnits ); writeGroup( 10, 0 ); writeGroup( 20, 0 ); writeGroup( 30, 0 ); writeGroup( 3, blockName ); ml->writeDxf( *this, mapUnitScaleFactor( mSymbologyScaleDenominator, ml->sizeUnit(), mMapUnits ), "0", &ctx, 0 ); //maplayer 0 -> block receives layer from INSERT statement writeGroup( 0, "ENDBLK" ); writeGroup( 8, 0 ); mPointSymbolBlocks.insert( ml, blockName ); ml->stopRender( ctx ); } } endSection(); }
void QgsMarkerSymbolV2::renderPoint( const QPointF& point, const QgsFeature* f, QgsRenderContext& context, int layer, bool selected ) { QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f ); if ( layer != -1 ) { if ( layer >= 0 && layer < mLayers.count() ) (( QgsMarkerSymbolLayerV2* ) mLayers[layer] )->renderPoint( point, symbolContext ); return; } for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) { QgsMarkerSymbolLayerV2* layer = ( QgsMarkerSymbolLayerV2* ) * it; layer->renderPoint( point, symbolContext ); } }
void QgsMarkerSymbolV2::setSize( double s ) { double origSize = size(); for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) { QgsMarkerSymbolLayerV2* layer = static_cast<QgsMarkerSymbolLayerV2*>( *it ); if ( layer->size() == origSize ) layer->setSize( s ); else { // proportionally scale size if ( origSize != 0 ) layer->setSize( layer->size() * s / origSize ); } } }
void QgsMarkerSymbolV2::setDataDefinedAngle( const QgsDataDefined& dd ) { const double symbolRotation = angle(); for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) { QgsMarkerSymbolLayerV2* layer = static_cast<QgsMarkerSymbolLayerV2 *>( *it ); if ( dd.hasDefaultValues() ) { layer->removeDataDefinedProperty( "angle" ); } else { if ( qgsDoubleNear( layer->angle(), symbolRotation ) ) { layer->setDataDefinedProperty( "angle", new QgsDataDefined( dd ) ); } else { QgsDataDefined* rotatedDD = rotateWholeSymbol( layer->angle() - symbolRotation, dd ); layer->setDataDefinedProperty( "angle", rotatedDD ); } } } }
QgsSymbolLayerV2* QgsFontMarkerSymbolLayerV2::createFromSld( QDomElement &element ) { QgsDebugMsg( "Entered." ); QDomElement graphicElem = element.firstChildElement( "Graphic" ); if ( graphicElem.isNull() ) return NULL; QString name, format; QColor color; double size; int chr; if ( !QgsSymbolLayerV2Utils::externalMarkerFromSld( graphicElem, name, format, chr, color, size ) ) return NULL; if ( !name.startsWith( "ttf://" ) || format != "ttf" ) return NULL; QString fontFamily = name.mid( 6 ); double angle = 0.0; QString angleFunc; if ( QgsSymbolLayerV2Utils::rotationFromSldElement( graphicElem, angleFunc ) ) { bool ok; double d = angleFunc.toDouble( &ok ); if ( ok ) angle = d; } QPointF offset; QgsSymbolLayerV2Utils::displacementFromSldElement( graphicElem, offset ); QgsMarkerSymbolLayerV2 *m = new QgsFontMarkerSymbolLayerV2( fontFamily, chr, size, color ); m->setAngle( angle ); m->setOffset( offset ); return m; }
void QgsMarkerSymbolV2::setSize( double s ) { double origSize = size(); for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) { QgsMarkerSymbolLayerV2* layer = static_cast<QgsMarkerSymbolLayerV2*>( *it ); if ( layer->size() == origSize ) layer->setSize( s ); else if ( origSize != 0 ) { // proportionally scale size layer->setSize( layer->size() * s / origSize ); } // also scale offset to maintain relative position if ( origSize != 0 && ( layer->offset().x() || layer->offset().y() ) ) layer->setOffset( QPointF( layer->offset().x() * s / origSize, layer->offset().y() * s / origSize ) ); } }
void QgsPointPatternFillSymbolLayer::toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const { for ( int i = 0; i < mMarkerSymbol->symbolLayerCount(); i++ ) { QDomElement symbolizerElem = doc.createElement( "se:PolygonSymbolizer" ); if ( !props.value( "uom", "" ).isEmpty() ) symbolizerElem.setAttribute( "uom", props.value( "uom", "" ) ); element.appendChild( symbolizerElem ); // <Geometry> QgsSymbolLayerV2Utils::createGeometryElement( doc, symbolizerElem, props.value( "geom", "" ) ); QDomElement fillElem = doc.createElement( "se:Fill" ); symbolizerElem.appendChild( fillElem ); QDomElement graphicFillElem = doc.createElement( "se:GraphicFill" ); fillElem.appendChild( graphicFillElem ); // store distanceX, distanceY, displacementX, displacementY in a <VendorOption> QString dist = QgsSymbolLayerV2Utils::encodePoint( QPointF( mDistanceX, mDistanceY ) ); QDomElement distanceElem = QgsSymbolLayerV2Utils::createVendorOptionElement( doc, "distance", dist ); symbolizerElem.appendChild( distanceElem ); QgsSymbolLayerV2 *layer = mMarkerSymbol->symbolLayer( i ); QgsMarkerSymbolLayerV2 *markerLayer = static_cast<QgsMarkerSymbolLayerV2 *>( layer ); if ( !markerLayer ) { QString errorMsg = QString( "MarkerSymbolLayerV2 expected, %1 found. Skip it." ).arg( layer->layerType() ); graphicFillElem.appendChild( doc.createComment( errorMsg ) ); } else { markerLayer->writeSldMarker( doc, graphicFillElem, props ); } } }
void QgsMarkerLineSymbolLayerV2::toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const { for ( int i = 0; i < mMarker->symbolLayerCount(); i++ ) { QDomElement symbolizerElem = doc.createElement( "se:LineSymbolizer" ); if ( !props.value( "uom", "" ).isEmpty() ) symbolizerElem.setAttribute( "uom", props.value( "uom", "" ) ); element.appendChild( symbolizerElem ); // <Geometry> QgsSymbolLayerV2Utils::createGeometryElement( doc, symbolizerElem, props.value( "geom", "" ) ); QString gap; switch ( mPlacement ) { case FirstVertex: symbolizerElem.appendChild( QgsSymbolLayerV2Utils::createVendorOptionElement( doc, "placement", "firstPoint" ) ); break; case LastVertex: symbolizerElem.appendChild( QgsSymbolLayerV2Utils::createVendorOptionElement( doc, "placement", "lastPoint" ) ); break; case CentralPoint: symbolizerElem.appendChild( QgsSymbolLayerV2Utils::createVendorOptionElement( doc, "placement", "centralPoint" ) ); break; case Vertex: // no way to get line/polygon's vertices, use a VendorOption symbolizerElem.appendChild( QgsSymbolLayerV2Utils::createVendorOptionElement( doc, "placement", "points" ) ); break; default: gap = QString::number( mInterval ); break; } if ( !mRotateMarker ) { // markers in LineSymbolizer must be drawn following the line orientation, // use a VendorOption when no marker rotation symbolizerElem.appendChild( QgsSymbolLayerV2Utils::createVendorOptionElement( doc, "rotateMarker", "0" ) ); } // <Stroke> QDomElement strokeElem = doc.createElement( "se:Stroke" ); symbolizerElem.appendChild( strokeElem ); // <GraphicStroke> QDomElement graphicStrokeElem = doc.createElement( "se:GraphicStroke" ); strokeElem.appendChild( graphicStrokeElem ); QgsSymbolLayerV2 *layer = mMarker->symbolLayer( i ); QgsMarkerSymbolLayerV2 *markerLayer = static_cast<QgsMarkerSymbolLayerV2 *>( layer ); if ( !markerLayer ) { graphicStrokeElem.appendChild( doc.createComment( QString( "MarkerSymbolLayerV2 expected, %1 found. Skip it." ).arg( markerLayer->layerType() ) ) ); } else { markerLayer->writeSldMarker( doc, graphicStrokeElem, props ); } if ( !gap.isEmpty() ) { QDomElement gapElem = doc.createElement( "se:Gap" ); QgsSymbolLayerV2Utils::createFunctionElement( doc, gapElem, gap ); graphicStrokeElem.appendChild( gapElem ); } if ( !qgsDoubleNear( mOffset, 0.0 ) ) { QDomElement perpOffsetElem = doc.createElement( "se:PerpendicularOffset" ); perpOffsetElem.appendChild( doc.createTextNode( QString::number( mOffset ) ) ); symbolizerElem.appendChild( perpOffsetElem ); } } }
void QgsMarkerSymbolV2::setDataDefinedSize( const QgsDataDefined &dd ) { const double symbolSize = size(); for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) { QgsMarkerSymbolLayerV2* layer = static_cast<QgsMarkerSymbolLayerV2 *>( *it ); if ( dd.hasDefaultValues() ) { layer->removeDataDefinedProperty( "size" ); layer->removeDataDefinedProperty( "offset" ); } else { if ( symbolSize == 0 || qgsDoubleNear( layer->size(), symbolSize ) ) { layer->setDataDefinedProperty( "size", new QgsDataDefined( dd ) ); } else { layer->setDataDefinedProperty( "size", scaleWholeSymbol( layer->size() / symbolSize, dd ) ); } if ( layer->offset().x() || layer->offset().y() ) { layer->setDataDefinedProperty( "offset", scaleWholeSymbol( layer->offset().x() / symbolSize, layer->offset().y() / symbolSize, dd ) ); } } } }
QgsSymbol* QgsSymbologyV2Conversion::symbolV2toV1( QgsSymbolV2* s ) { if ( s == NULL || s->symbolLayerCount() == 0 ) return NULL; // we will use only the first symbol layer QgsSymbolLayerV2* sl = s->symbolLayer( 0 ); switch ( sl->type() ) { case QgsSymbolV2::Marker: { QgsMarkerSymbolLayerV2* msl = static_cast<QgsMarkerSymbolLayerV2*>( sl ); QgsSymbol* sOld = new QgsSymbol( QGis::Point ); sOld->setFillColor( sl->color() ); sOld->setFillStyle( Qt::SolidPattern ); sOld->setPointSize( msl->size() ); if ( sl->layerType() == "SimpleMarker" ) { QgsSimpleMarkerSymbolLayerV2* smsl = static_cast<QgsSimpleMarkerSymbolLayerV2*>( sl ); sOld->setColor( smsl->borderColor() ); sOld->setNamedPointSymbol( "hard:" + smsl->name() ); } else if ( sl->layerType() == "SvgMarker" ) { QgsSvgMarkerSymbolLayerV2* smsl = static_cast<QgsSvgMarkerSymbolLayerV2*>( sl ); sOld->setNamedPointSymbol( "svg:" + smsl->path() ); } return sOld; } break; case QgsSymbolV2::Line: { QgsLineSymbolLayerV2* lsl = static_cast<QgsLineSymbolLayerV2*>( sl ); QgsSymbol* sOld = new QgsSymbol( QGis::Line ); sOld->setColor( sl->color() ); sOld->setLineWidth( lsl->width() ); if ( sl->layerType() == "SimpleLine" ) { // add specific settings QgsSimpleLineSymbolLayerV2* slsl = static_cast<QgsSimpleLineSymbolLayerV2*>( sl ); sOld->setLineStyle( slsl->penStyle() ); } return sOld; } case QgsSymbolV2::Fill: { QgsSymbol* sOld = new QgsSymbol( QGis::Polygon ); sOld->setFillColor( sl->color() ); if ( sl->layerType() == "SimpleFill" ) { // add specifc settings QgsSimpleFillSymbolLayerV2* sfsl = static_cast<QgsSimpleFillSymbolLayerV2*>( sl ); sOld->setColor( sfsl->borderColor() ); sOld->setLineWidth( sfsl->borderWidth() ); sOld->setLineStyle( sfsl->borderStyle() ); sOld->setFillStyle( sfsl->brushStyle() ); } return sOld; } } return NULL; // should never get here }