@@ -702,7 +702,7 @@ void QgsSimpleMarkerSymbolLayerV2::drawMarker( QPainter* p, QgsSymbolV2RenderCon
702702 }
703703}
704704
705- void QgsSimpleMarkerSymbolLayerV2::writeDxf ( QgsDxfExport& e, double mmMapUnitScaleFactor, const QString& layerName, const QgsSymbolV2RenderContext* context, const QgsFeature* f, const QPointF& offset ) const
705+ void QgsSimpleMarkerSymbolLayerV2::writeDxf ( QgsDxfExport& e, double mmMapUnitScaleFactor, const QString& layerName, const QgsSymbolV2RenderContext* context, const QgsFeature* f, const QPointF& shift ) const
706706{
707707 // data defined size?
708708 double size = mSize ;
@@ -738,41 +738,72 @@ void QgsSimpleMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitSc
738738 size *= mmMapUnitScaleFactor;
739739 }
740740 double halfSize = size / 2.0 ;
741- int colorIndex = QgsDxfExport::closestColorMatch ( mBrush .color ().rgb () );
742741
743- // data defined size
744742
743+ QColor c = mBrush .color ();
744+ QgsExpression* colorExpression = expression ( " color" );
745+ if ( colorExpression )
746+ {
747+ c = QgsSymbolLayerV2Utils::decodeColor ( colorExpression->evaluate ( *f ).toString () );
748+ }
749+ int colorIndex = QgsDxfExport::closestColorMatch ( c.rgb () );
750+
751+ // offset
752+ double offsetX = 0 ;
753+ double offsetY = 0 ;
754+ markerOffset ( *context, offsetX, offsetY );
755+ QPointF off ( offsetX, offsetY );
756+
757+ // angle
758+ double angle = mAngle ;
759+ QgsExpression* angleExpression = expression ( " angle" );
760+ if ( angleExpression )
761+ {
762+ angle = angleExpression->evaluate ( const_cast <QgsFeature*>( context->feature () ) ).toDouble ();
763+ }
764+ angle = -angle; // rotation in Qt is counterclockwise
765+ if ( angle )
766+ off = _rotatedOffset ( off, angle );
767+
768+ if ( mSizeUnit == QgsSymbolV2::MM )
769+ {
770+ off *= mmMapUnitScaleFactor;
771+ }
745772
746- // data defined color, rotation, offset
773+ QTransform t;
774+ t.translate ( shift.x () + offsetX, shift.y () + offsetY );
747775
776+ if ( angle != 0 )
777+ t.rotate ( angle );
748778
779+ // data defined symbol name
749780
750781 if ( mName == " circle" )
751782 {
752783 e.writeGroup ( 0 , " CIRCLE" );
753784 e.writeGroup ( 8 , layerName );
754785
755786 e.writeGroup ( 62 , colorIndex );
756- e.writeGroup ( 10 , halfSize + offset .x () );
757- e.writeGroup ( 20 , halfSize + offset .y () );
787+ e.writeGroup ( 10 , halfSize + shift .x () );
788+ e.writeGroup ( 20 , halfSize + shift .y () );
758789 e.writeGroup ( 30 , 0.0 );
759790 e.writeGroup ( 40 , halfSize );
760791 }
761792 else if ( mName == " square" || mName == " rectangle" )
762793 {
763- QgsPoint pt1 ( 0.0 + offset. x (), 0.0 + offset. y ( ) );
764- QgsPoint pt2 ( size + offset. x (), 0.0 + offset. y ( ) );
765- QgsPoint pt3 ( 0.0 + offset. x (), size + offset. y ( ) );
766- QgsPoint pt4 ( size + offset. x (), size + offset. y ( ) );
767- e.writeSolid ( layerName, colorIndex, pt1, pt2, pt3, pt4 );
794+ QPointF pt1 = t. map ( QPointF ( -halfSize, -halfSize ) );
795+ QPointF pt2 = t. map ( QPointF ( halfSize, -halfSize ) );
796+ QPointF pt3 = t. map ( QPointF ( -halfSize, halfSize ) );
797+ QPointF pt4 = t. map ( QPointF ( halfSize, halfSize ) );
798+ e.writeSolid ( layerName, colorIndex, QgsPoint ( pt1. x (), pt1. y () ), QgsPoint ( pt2. x (), pt2. y () ), QgsPoint ( pt3. x (), pt3. y () ), QgsPoint ( pt4. x (), pt4. y () ) );
768799 }
769800 else if ( mName == " diamond" )
770801 {
771- QgsPoint pt1 ( 0.0 + offset. x (), halfSize + offset. y ( ) );
772- QgsPoint pt2 ( halfSize + offset. x (), 0.0 + offset. y ( ) );
773- QgsPoint pt3 ( halfSize + offset. x (), size + offset. y ( ) );
774- QgsPoint pt4 ( size + offset. x (), halfSize + offset. y ( ) );
775- e.writeSolid ( layerName, colorIndex, pt1, pt2, pt3, pt4 );
802+ QPointF pt1 = t. map ( QPointF ( - halfSize, 0 ) );
803+ QPointF pt2 = t. map ( QPointF ( 0 , -halfSize ) );
804+ QPointF pt3 = t. map ( QPointF ( 0 , halfSize ) );
805+ QPointF pt4 = t. map ( QPointF ( halfSize, 0 ) );
806+ e.writeSolid ( layerName, colorIndex, QgsPoint ( pt1. x (), pt1. y () ), QgsPoint ( pt2. x (), pt2. y () ), QgsPoint ( pt3. x (), pt3. y () ), QgsPoint ( pt4. x (), pt4. y () ) );
776807 }
777808}
778809
@@ -1182,10 +1213,10 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::createFromSld( QDomElement &element
11821213}
11831214
11841215void QgsSvgMarkerSymbolLayerV2::writeDxf ( QgsDxfExport& e, double mmMapUnitScaleFactor, const QString& layerName, const QgsSymbolV2RenderContext* context, const QgsFeature* f,
1185- const QPointF& offset ) const
1216+ const QPointF& shift ) const
11861217{
11871218 Q_UNUSED ( layerName );
1188- Q_UNUSED ( offset ); // todo...
1219+ Q_UNUSED ( shift ); // todo...
11891220
11901221 QSvgRenderer r ( mPath );
11911222 if ( !r.isValid () )
@@ -1195,12 +1226,69 @@ void QgsSvgMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScale
11951226
11961227 QgsDxfPaintDevice pd ( &e );
11971228 pd.setDrawingSize ( QSizeF ( r.defaultSize () ) );
1198- double size = mSize * mmMapUnitScaleFactor ;
1199- pd.setOutputSize ( QRectF ( 0 , 0 , size, size ) );
1200- pd.setLayer ( layerName );
1201- QPainter p;
12021229
1230+ // size
1231+ double size = mSize ;
1232+ QgsExpression* sizeExpression = expression ( " size" );
1233+ bool hasDataDefinedSize = context->renderHints () & QgsSymbolV2::DataDefinedSizeScale || sizeExpression;
1234+
1235+ if ( sizeExpression )
1236+ {
1237+ size = sizeExpression->evaluate ( *f ).toDouble ();
1238+ }
1239+ if ( mSizeUnit == QgsSymbolV2::MM )
1240+ {
1241+ size *= mmMapUnitScaleFactor;
1242+ }
1243+
1244+ if ( hasDataDefinedSize )
1245+ {
1246+ switch ( mScaleMethod )
1247+ {
1248+ case QgsSymbolV2::ScaleArea:
1249+ size = sqrt ( size );
1250+ break ;
1251+ case QgsSymbolV2::ScaleDiameter:
1252+ break ;
1253+ }
1254+ }
1255+
1256+ double halfSize = size / 2.0 ;
1257+
1258+ // offset, angle
1259+ QPointF offset = mOffset ;
1260+ QgsExpression* offsetExpression = expression ( " offset" );
1261+ if ( offsetExpression )
1262+ {
1263+ QString offsetString = offsetExpression->evaluate ( *f ).toString ();
1264+ offset = QgsSymbolLayerV2Utils::decodePoint ( offsetString );
1265+ }
1266+ double offsetX = offset.x ();
1267+ double offsetY = offset.y ();
1268+ if ( mSizeUnit == QgsSymbolV2::MM )
1269+ {
1270+ offsetX *= mmMapUnitScaleFactor;
1271+ offsetY *= mmMapUnitScaleFactor;
1272+ }
1273+
1274+ QPointF outputOffset ( offsetX, offsetY );
1275+
1276+ double angle = mAngle ;
1277+ QgsExpression* angleExpression = expression ( " angle" );
1278+ if ( angleExpression )
1279+ {
1280+ angle = angleExpression->evaluate ( *f ).toDouble ();
1281+ }
1282+ // angle = -angle; //rotation in Qt is counterclockwise
1283+ if ( angle )
1284+ outputOffset = _rotatedOffset ( outputOffset, angle );
1285+
1286+ QPainter p;
12031287 p.begin ( &pd );
1288+ p.rotate ( angle );
1289+ pd.setShift ( shift - QPointF ( halfSize, halfSize ) );
1290+ pd.setOutputSize ( QRectF ( 0 , 0 , size, size ) );
1291+ pd.setLayer ( layerName );
12041292 r.render ( &p );
12051293 p.end ();
12061294}
0 commit comments