Skip to content

Commit 43e8321

Browse files
committed
Differentiate between image angle and line pattern angle. Fixes rotation problem
1 parent e2c5fe7 commit 43e8321

File tree

4 files changed

+69
-69
lines changed

4 files changed

+69
-69
lines changed

src/core/symbology-ng/qgsfillsymbollayerv2.cpp

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ void QgsImageFillSymbolLayer::renderPolygon( const QPolygonF& points, QList<QPol
174174

175175
bool QgsImageFillSymbolLayer::setSubSymbol( QgsSymbolV2* symbol )
176176
{
177-
if( !symbol ) //unset current outline
177+
if ( !symbol ) //unset current outline
178178
{
179179
delete mOutline;
180180
mOutline = 0;
@@ -382,16 +382,16 @@ QgsSymbolLayerV2* QgsLinePatternFillSymbolLayer::create( const QgsStringMap& pro
382382
QgsLinePatternFillSymbolLayer* patternLayer = new QgsLinePatternFillSymbolLayer();
383383

384384
//default values
385-
double angle = 45;
385+
double lineAngle = 45;
386386
double distance = 5;
387387
double lineWidth = 0.5;
388388
QColor color( Qt::black );
389389

390-
if ( properties.contains( "angle" ) )
390+
if ( properties.contains( "lineangle" ) )
391391
{
392-
angle = properties["angle"].toDouble();
392+
lineAngle = properties["lineangle"].toDouble();
393393
}
394-
patternLayer->setAngle( angle );
394+
patternLayer->setLineAngle( lineAngle );
395395

396396
if ( properties.contains( "distance" ) )
397397
{
@@ -422,15 +422,15 @@ void QgsLinePatternFillSymbolLayer::startRender( QgsSymbolV2RenderContext& conte
422422
{
423423
//create image
424424
int height, width;
425-
if ( doubleNear( mAngle, 0 ) || doubleNear( mAngle, 360 ) || doubleNear( mAngle, 90 ) || doubleNear( mAngle, 180 ) || doubleNear( mAngle, 270 ) )
425+
if ( doubleNear( mLineAngle, 0 ) || doubleNear( mLineAngle, 360 ) || doubleNear( mLineAngle, 90 ) || doubleNear( mLineAngle, 180 ) || doubleNear( mLineAngle, 270 ) )
426426
{
427427
height = context.outputPixelSize( mDistance );
428428
width = height; //width can be set to arbitrary value
429429
}
430430
else
431431
{
432-
height = fabs( context.outputPixelSize( mDistance ) / cos( mAngle * M_PI / 180 ) ); //keep perpendicular distance between lines constant
433-
width = fabs( height / tan( mAngle * M_PI / 180 ) );
432+
height = fabs( context.outputPixelSize( mDistance ) / cos( mLineAngle * M_PI / 180 ) ); //keep perpendicular distance between lines constant
433+
width = fabs( height / tan( mLineAngle * M_PI / 180 ) );
434434
}
435435

436436
double outlinePixelWidth = context.outputPixelSize( mLineWidth );
@@ -447,19 +447,19 @@ void QgsLinePatternFillSymbolLayer::startRender( QgsSymbolV2RenderContext& conte
447447
p.setPen( pen );
448448

449449
//draw line and dots in the border
450-
if ( doubleNear( mAngle, 0.0 ) || doubleNear( mAngle, 360.0 ) || doubleNear( mAngle, 180.0 ) )
450+
if ( doubleNear( mLineAngle, 0.0 ) || doubleNear( mLineAngle, 360.0 ) || doubleNear( mLineAngle, 180.0 ) )
451451
{
452452
p.drawLine( QPointF( 0, height / 2.0 ), QPointF( width, height / 2.0 ) );
453453
}
454-
else if ( doubleNear( mAngle, 90.0 ) || doubleNear( mAngle, 270.0 ) )
454+
else if ( doubleNear( mLineAngle, 90.0 ) || doubleNear( mLineAngle, 270.0 ) )
455455
{
456456
p.drawLine( QPointF( width / 2.0, 0 ), QPointF( width / 2.0, height ) );
457457
}
458-
else if (( mAngle > 0 && mAngle < 90 ) || ( mAngle > 180 && mAngle < 270 ) )
458+
else if (( mLineAngle > 0 && mLineAngle < 90 ) || ( mLineAngle > 180 && mLineAngle < 270 ) )
459459
{
460460
p.drawLine( QPointF( 0, height ), QPointF( width, 0 ) );
461461
}
462-
else if (( mAngle < 180 ) || ( mAngle > 270 && mAngle < 360 ) )
462+
else if (( mLineAngle < 180 ) || ( mLineAngle > 270 && mLineAngle < 360 ) )
463463
{
464464
p.drawLine( QPointF( width, height ), QPointF( 0, 0 ) );
465465
}
@@ -468,31 +468,31 @@ void QgsLinePatternFillSymbolLayer::startRender( QgsSymbolV2RenderContext& conte
468468
double d1 = 0;
469469
double d2 = 0;
470470
QPolygonF triangle1, triangle2;
471-
if ( mAngle > 0 && mAngle < 90 )
471+
if ( mLineAngle > 0 && mLineAngle < 90 )
472472
{
473-
d1 = ( outlinePixelWidth / 2.0 ) / cos( mAngle * M_PI / 180 );
474-
d2 = ( outlinePixelWidth / 2.0 ) / cos(( 90 - mAngle ) * M_PI / 180 );
473+
d1 = ( outlinePixelWidth / 2.0 ) / cos( mLineAngle * M_PI / 180 );
474+
d2 = ( outlinePixelWidth / 2.0 ) / cos(( 90 - mLineAngle ) * M_PI / 180 );
475475
triangle1 << QPointF( 0, 0 ) << QPointF( 0, d1 ) << QPointF( d2, 0 ) << QPointF( 0, 0 );
476476
triangle2 << QPointF( width, height ) << QPointF( width - d2, height ) << QPointF( width, height - d1 ) << QPointF( width, height );
477477
}
478-
else if ( mAngle > 90 && mAngle < 180 )
478+
else if ( mLineAngle > 90 && mLineAngle < 180 )
479479
{
480-
d1 = ( outlinePixelWidth / 2.0 ) / cos(( mAngle - 90 ) * M_PI / 180 );
481-
d2 = ( outlinePixelWidth / 2.0 ) / cos(( 180 - mAngle ) * M_PI / 180 );
480+
d1 = ( outlinePixelWidth / 2.0 ) / cos(( mLineAngle - 90 ) * M_PI / 180 );
481+
d2 = ( outlinePixelWidth / 2.0 ) / cos(( 180 - mLineAngle ) * M_PI / 180 );
482482
triangle1 << QPointF( width, 0 ) << QPointF( width - d1, 0 ) << QPointF( width, d2 ) << QPointF( width, 0 );
483483
triangle2 << QPointF( 0, height ) << QPointF( 0, height - d2 ) << QPointF( d1, height ) << QPointF( 0, height );
484484
}
485-
else if ( mAngle > 180 && mAngle < 270 )
485+
else if ( mLineAngle > 180 && mLineAngle < 270 )
486486
{
487-
d1 = ( outlinePixelWidth / 2.0 ) / cos(( mAngle - 180 ) * M_PI / 180 );
488-
d2 = ( outlinePixelWidth / 2.0 ) / cos(( 270 - mAngle ) * M_PI / 180 );
487+
d1 = ( outlinePixelWidth / 2.0 ) / cos(( mLineAngle - 180 ) * M_PI / 180 );
488+
d2 = ( outlinePixelWidth / 2.0 ) / cos(( 270 - mLineAngle ) * M_PI / 180 );
489489
triangle1 << QPointF( 0, 0 ) << QPointF( 0, d1 ) << QPointF( d2, 0 ) << QPointF( 0, 0 );
490490
triangle2 << QPointF( width, height ) << QPointF( width - d2, height ) << QPointF( width, height - d1 ) << QPointF( width, height );
491491
}
492-
else if ( mAngle > 270 && mAngle < 360 )
492+
else if ( mLineAngle > 270 && mLineAngle < 360 )
493493
{
494-
d1 = ( outlinePixelWidth / 2.0 ) / cos(( mAngle - 270 ) * M_PI / 180 );
495-
d2 = ( outlinePixelWidth / 2.0 ) / cos(( 360 - mAngle ) * M_PI / 180 );
494+
d1 = ( outlinePixelWidth / 2.0 ) / cos(( mLineAngle - 270 ) * M_PI / 180 );
495+
d2 = ( outlinePixelWidth / 2.0 ) / cos(( 360 - mLineAngle ) * M_PI / 180 );
496496
triangle1 << QPointF( width, 0 ) << QPointF( width - d1, 0 ) << QPointF( width, d2 ) << QPointF( width, 0 );
497497
triangle2 << QPointF( 0, height ) << QPointF( 0, height - d2 ) << QPointF( d1, height ) << QPointF( 0, height );
498498
}
@@ -532,7 +532,7 @@ void QgsLinePatternFillSymbolLayer::stopRender( QgsSymbolV2RenderContext & )
532532
QgsStringMap QgsLinePatternFillSymbolLayer::properties() const
533533
{
534534
QgsStringMap map;
535-
map.insert( "angle", QString::number( mAngle ) );
535+
map.insert( "lineangle", QString::number( mLineAngle ) );
536536
map.insert( "distance", QString::number( mDistance ) );
537537
map.insert( "linewidth", QString::number( mLineWidth ) );
538538
map.insert( "color", QgsSymbolLayerV2Utils::encodeColor( mColor ) );
@@ -552,7 +552,7 @@ QgsSymbolLayerV2* QgsLinePatternFillSymbolLayer::clone() const
552552
////////////////////////
553553

554554
QgsPointPatternFillSymbolLayer::QgsPointPatternFillSymbolLayer(): QgsImageFillSymbolLayer(), mMarkerSymbol( 0 ), mDistanceX( 15 ),
555-
mDistanceY( 15 ), mDisplacementX( 0 ), mDisplacementY( 0 )
555+
mDistanceY( 15 ), mDisplacementX( 0 ), mDisplacementY( 0 )
556556
{
557557
mDistanceX = 15;
558558
mDistanceY = 15;
@@ -569,19 +569,19 @@ QgsPointPatternFillSymbolLayer::~QgsPointPatternFillSymbolLayer()
569569
QgsSymbolLayerV2* QgsPointPatternFillSymbolLayer::create( const QgsStringMap& properties )
570570
{
571571
QgsPointPatternFillSymbolLayer* layer = new QgsPointPatternFillSymbolLayer();
572-
if( properties.contains("distance_x") )
572+
if ( properties.contains( "distance_x" ) )
573573
{
574574
layer->setDistanceX( properties["distance_x"].toDouble() );
575575
}
576-
if( properties.contains("distance_y") )
576+
if ( properties.contains( "distance_y" ) )
577577
{
578578
layer->setDistanceY( properties["distance_y"].toDouble() );
579579
}
580-
if( properties.contains("displacement_x") )
580+
if ( properties.contains( "displacement_x" ) )
581581
{
582582
layer->setDisplacementX( properties["displacement_x"].toDouble() );
583583
}
584-
if( properties.contains("displacement_y") )
584+
if ( properties.contains( "displacement_y" ) )
585585
{
586586
layer->setDisplacementY( properties["displacement_y"].toDouble() );
587587
}
@@ -602,7 +602,7 @@ void QgsPointPatternFillSymbolLayer::startRender( QgsSymbolV2RenderContext& cont
602602
QImage patternImage( width, height, QImage::Format_ARGB32 );
603603
patternImage.fill( 0 );
604604

605-
if( mMarkerSymbol )
605+
if ( mMarkerSymbol )
606606
{
607607
QPainter p( &patternImage );
608608

@@ -631,7 +631,7 @@ void QgsPointPatternFillSymbolLayer::startRender( QgsSymbolV2RenderContext& cont
631631
mMarkerSymbol->renderPoint( QPointF( displacementPixelX, height / 2.0 ), context.feature(), pointRenderContext );
632632
mMarkerSymbol->renderPoint( QPointF( width / 2.0 + displacementPixelX, height / 2.0 - displacementPixelY ), context.feature(), pointRenderContext );
633633
mMarkerSymbol->renderPoint( QPointF( width + displacementPixelX, height / 2.0 ), context.feature(), pointRenderContext );
634-
mMarkerSymbol->renderPoint( QPointF( width / 2.0, height - displacementPixelY), context.feature(), pointRenderContext );
634+
mMarkerSymbol->renderPoint( QPointF( width / 2.0, height - displacementPixelY ), context.feature(), pointRenderContext );
635635

636636
mMarkerSymbol->stopRender( pointRenderContext );
637637
}
@@ -677,7 +677,7 @@ QgsStringMap QgsPointPatternFillSymbolLayer::properties() const
677677
QgsSymbolLayerV2* QgsPointPatternFillSymbolLayer::clone() const
678678
{
679679
QgsSymbolLayerV2* clonedLayer = QgsPointPatternFillSymbolLayer::create( properties() );
680-
if( mMarkerSymbol )
680+
if ( mMarkerSymbol )
681681
{
682682
clonedLayer->setSubSymbol( mMarkerSymbol->clone() );
683683
}
@@ -686,12 +686,12 @@ QgsSymbolLayerV2* QgsPointPatternFillSymbolLayer::clone() const
686686

687687
bool QgsPointPatternFillSymbolLayer::setSubSymbol( QgsSymbolV2* symbol )
688688
{
689-
if( !symbol )
689+
if ( !symbol )
690690
{
691691
return false;
692692
}
693693

694-
if(symbol->type() == QgsSymbolV2::Marker )
694+
if ( symbol->type() == QgsSymbolV2::Marker )
695695
{
696696
QgsMarkerSymbolV2* markerSymbol = static_cast<QgsMarkerSymbolV2*>( symbol );
697697
delete mMarkerSymbol;

src/core/symbology-ng/qgsfillsymbollayerv2.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -149,23 +149,23 @@ class CORE_EXPORT QgsLinePatternFillSymbolLayer: public QgsImageFillSymbolLayer
149149
QgsSymbolLayerV2* clone() const;
150150

151151
//getters and setters
152-
void setAngle( double a ){ mAngle = a; }
153-
double angle() const { return mAngle; }
154-
void setDistance( double d ){ mDistance = d; }
152+
void setLineAngle( double a ) { mLineAngle = a; }
153+
double lineAngle() const { return mLineAngle; }
154+
void setDistance( double d ) { mDistance = d; }
155155
double distance() const { return mDistance; }
156-
void setLineWidth( double w ){ mLineWidth = w; }
156+
void setLineWidth( double w ) { mLineWidth = w; }
157157
double lineWidth() const { return mLineWidth; }
158-
void setColor( const QColor& c ){ mColor = c; }
159-
QColor color() const{ return mColor; }
158+
void setColor( const QColor& c ) { mColor = c; }
159+
QColor color() const { return mColor; }
160160

161161
protected:
162162
/**Distance (in mm or map units) between lines*/
163163
double mDistance;
164164
/**Line width (in mm or map units)*/
165165
double mLineWidth;
166166
QColor mColor;
167-
//todo: line type
168-
double mAngle;
167+
/**Vector line angle in degrees (0 = horizontal, counterclockwise)*/
168+
double mLineAngle;
169169
};
170170

171171
class CORE_EXPORT QgsPointPatternFillSymbolLayer: public QgsImageFillSymbolLayer
@@ -193,10 +193,10 @@ class CORE_EXPORT QgsPointPatternFillSymbolLayer: public QgsImageFillSymbolLayer
193193
void setDistanceY( double d ) { mDistanceY = d; }
194194

195195
double displacementX() const { return mDisplacementX; }
196-
void setDisplacementX( double d ){ mDisplacementX = d; }
196+
void setDisplacementX( double d ) { mDisplacementX = d; }
197197

198198
double displacementY() const { return mDisplacementY; }
199-
void setDisplacementY( double d ){ mDisplacementY = d; }
199+
void setDisplacementY( double d ) { mDisplacementY = d; }
200200

201201
bool setSubSymbol( QgsSymbolV2* symbol );
202202
virtual QgsSymbolV2* subSymbol() { return mMarkerSymbol; }

src/core/symbology-ng/qgssymbollayerv2.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ QgsLineSymbolLayerV2::QgsLineSymbolLayerV2( bool locked )
2222
}
2323

2424
QgsFillSymbolLayerV2::QgsFillSymbolLayerV2( bool locked )
25-
: QgsSymbolLayerV2( QgsSymbolV2::Fill, locked )
25+
: QgsSymbolLayerV2( QgsSymbolV2::Fill, locked ), mAngle( 0.0 )
2626
{
2727
}
2828

0 commit comments

Comments
 (0)