@@ -413,7 +413,7 @@ void QgsSimpleFillSymbolLayer::toSld( QDomDocument &doc, QDomElement &element, c
413
413
bool exportOk { false };
414
414
if ( ! context.exportFilePath ().isEmpty () && context.exportOptions ().testFlag ( Qgis::SldExportOption::Png ) && mBrush .style () != Qt::NoBrush )
415
415
{
416
- const QImage image { toTiledPattern ( ) };
416
+ const QImage image { toTiledPatternImage ( ) };
417
417
if ( ! image.isNull () )
418
418
{
419
419
QDomElement graphicFillElem = doc.createElement ( QStringLiteral ( " se:GraphicFill" ) );
@@ -570,10 +570,8 @@ Qt::BrushStyle QgsSimpleFillSymbolLayer::dxfBrushStyle() const
570
570
return mBrushStyle ;
571
571
}
572
572
573
- QImage QgsSimpleFillSymbolLayer::toTiledPattern ( ) const
573
+ QImage QgsSimpleFillSymbolLayer::toTiledPatternImage ( ) const
574
574
{
575
- // TODO: calculate size, e.g. for solid brush a 1x1 image is sufficient
576
- // for other brush styles must be calculated.
577
575
QPixmap pixmap ( QSize ( 32 , 32 ) );
578
576
pixmap.fill ( Qt::transparent );
579
577
QPainter painter;
@@ -2640,7 +2638,7 @@ void QgsLinePatternFillSymbolLayer::stopFeatureRender( const QgsFeature &, QgsRe
2640
2638
// deliberately don't pass this on to subsymbol here
2641
2639
}
2642
2640
2643
- QImage QgsLinePatternFillSymbolLayer::toTiledPattern () const
2641
+ QImage QgsLinePatternFillSymbolLayer::toTiledPatternImage () const
2644
2642
{
2645
2643
2646
2644
double lineAngleRads { qDegreesToRadians ( mLineAngle ) };
@@ -3413,7 +3411,7 @@ void QgsLinePatternFillSymbolLayer::toSld( QDomDocument &doc, QDomElement &eleme
3413
3411
bool exportOk { false };
3414
3412
if ( ! context.exportFilePath ().isEmpty () && context.exportOptions ().testFlag ( Qgis::SldExportOption::Png ) )
3415
3413
{
3416
- const QImage image { toTiledPattern ( ) };
3414
+ const QImage image { toTiledPatternImage ( ) };
3417
3415
if ( ! image.isNull () )
3418
3416
{
3419
3417
const QFileInfo info { context.exportFilePath () };
@@ -4361,7 +4359,7 @@ void QgsPointPatternFillSymbolLayer::toSld( QDomDocument &doc, QDomElement &elem
4361
4359
bool exportOk { false };
4362
4360
if ( ! context.exportFilePath ().isEmpty () && context.exportOptions ().testFlag ( Qgis::SldExportOption::Png ) )
4363
4361
{
4364
- const QImage image { toTiledPattern ( ) };
4362
+ const QImage image { toTiledPatternImage ( ) };
4365
4363
if ( ! image.isNull () )
4366
4364
{
4367
4365
QDomElement graphicElem = doc.createElement ( QStringLiteral ( " se:Graphic" ) );
@@ -4408,7 +4406,7 @@ void QgsPointPatternFillSymbolLayer::toSld( QDomDocument &doc, QDomElement &elem
4408
4406
}
4409
4407
}
4410
4408
4411
- QImage QgsPointPatternFillSymbolLayer::toTiledPattern () const
4409
+ QImage QgsPointPatternFillSymbolLayer::toTiledPatternImage () const
4412
4410
{
4413
4411
4414
4412
double angleRads { qDegreesToRadians ( mAngle ) };
@@ -4472,92 +4470,102 @@ QgsSymbolLayer *QgsPointPatternFillSymbolLayer::createFromSld( QDomElement &elem
4472
4470
std::unique_ptr< QgsPointPatternFillSymbolLayer > pointPatternFillSl = std::make_unique< QgsPointPatternFillSymbolLayer >();
4473
4471
pointPatternFillSl->setSubSymbol ( marker.release () );
4474
4472
4475
- // Set distance X and Y from vendor options
4476
- QgsStringMap vendorOptions = QgsSymbolLayerUtils::getVendorOptionList ( element );
4477
- for ( QgsStringMap::iterator it = vendorOptions.begin (); it != vendorOptions.end (); ++it )
4473
+ auto distanceParser = [ & ]( const QStringList & values )
4478
4474
{
4479
- if ( it.key () == QLatin1String ( " graphic-margin" ) )
4480
- {
4481
-
4482
- // This may not be correct in all cases, TODO: check "uom"
4483
- pointPatternFillSl->setDistanceXUnit ( QgsUnitTypes::RenderUnit::RenderPixels );
4484
- pointPatternFillSl->setDistanceYUnit ( QgsUnitTypes::RenderUnit::RenderPixels );
4485
4475
4486
- const QStringList values = it.value ().split ( ' ' );
4476
+ // This may not be correct in all cases, TODO: check "uom"
4477
+ pointPatternFillSl->setDistanceXUnit ( QgsUnitTypes::RenderUnit::RenderPixels );
4478
+ pointPatternFillSl->setDistanceYUnit ( QgsUnitTypes::RenderUnit::RenderPixels );
4487
4479
4488
- switch ( values.count ( ) )
4480
+ switch ( values.count ( ) )
4481
+ {
4482
+ case 1 : // top-right-bottom-left (single value for all four margins)
4489
4483
{
4490
- case 1 : // top-right-bottom-left (single value for all four margins)
4484
+ bool ok;
4485
+ const double v { values.at ( 0 ).toDouble ( &ok ) };
4486
+ if ( ok )
4491
4487
{
4492
- bool ok;
4493
- const double v { values.at ( 0 ).toDouble ( &ok ) };
4494
- if ( ok )
4495
- {
4496
- pointPatternFillSl->setDistanceX ( v * 2 + markerSize );
4497
- pointPatternFillSl->setDistanceY ( v * 2 + markerSize );
4498
- }
4499
- break ;
4488
+ pointPatternFillSl->setDistanceX ( v * 2 + markerSize );
4489
+ pointPatternFillSl->setDistanceY ( v * 2 + markerSize );
4500
4490
}
4501
- case 2 : // top-bottom,right-left (two values, top and bottom sharing the same value)
4491
+ break ;
4492
+ }
4493
+ case 2 : // top-bottom,right-left (two values, top and bottom sharing the same value)
4494
+ {
4495
+ bool ok;
4496
+ const double vX { values.at ( 1 ).toDouble ( &ok ) };
4497
+ if ( ok )
4502
4498
{
4503
- bool ok;
4504
- const double vX { values.at ( 1 ).toDouble ( &ok ) };
4505
- if ( ok )
4506
- {
4507
- pointPatternFillSl->setDistanceX ( vX * 2 + markerSize );
4508
- }
4509
- const double vY { values.at ( 0 ).toDouble ( &ok ) };
4510
- if ( ok )
4511
- {
4512
- pointPatternFillSl->setDistanceY ( vY * 2 + markerSize );
4513
- }
4514
- break ;
4499
+ pointPatternFillSl->setDistanceX ( vX * 2 + markerSize );
4515
4500
}
4516
- case 3 : // top,right-left,bottom (three values, with right and left sharing the same value)
4501
+ const double vY { values.at ( 0 ).toDouble ( &ok ) };
4502
+ if ( ok )
4517
4503
{
4518
- bool ok;
4519
- const double vX { values.at ( 1 ).toDouble ( &ok ) };
4520
- if ( ok )
4521
- {
4522
- pointPatternFillSl->setDistanceX ( vX * 2 + markerSize );
4523
- }
4524
- const double vYt { values.at ( 0 ).toDouble ( &ok ) };
4504
+ pointPatternFillSl->setDistanceY ( vY * 2 + markerSize );
4505
+ }
4506
+ break ;
4507
+ }
4508
+ case 3 : // top,right-left,bottom (three values, with right and left sharing the same value)
4509
+ {
4510
+ bool ok;
4511
+ const double vX { values.at ( 1 ).toDouble ( &ok ) };
4512
+ if ( ok )
4513
+ {
4514
+ pointPatternFillSl->setDistanceX ( vX * 2 + markerSize );
4515
+ }
4516
+ const double vYt { values.at ( 0 ).toDouble ( &ok ) };
4517
+ if ( ok )
4518
+ {
4519
+ const double vYb { values.at ( 2 ).toDouble ( &ok ) };
4525
4520
if ( ok )
4526
4521
{
4527
- const double vYb { values.at ( 2 ).toDouble ( &ok ) };
4528
- if ( ok )
4529
- {
4530
- pointPatternFillSl->setDistanceY ( ( vYt + vYb ) + markerSize );
4531
- }
4522
+ pointPatternFillSl->setDistanceY ( ( vYt + vYb ) + markerSize );
4532
4523
}
4533
- break ;
4534
4524
}
4535
- case 4 : // top,right,bottom,left (one explicit value per margin)
4525
+ break ;
4526
+ }
4527
+ case 4 : // top,right,bottom,left (one explicit value per margin)
4528
+ {
4529
+ bool ok;
4530
+ const double vYt { values.at ( 0 ).toDouble ( &ok ) };
4531
+ if ( ok )
4536
4532
{
4537
- bool ok;
4538
- const double vYt { values.at ( 0 ).toDouble ( &ok ) };
4533
+ const double vYb { values.at ( 2 ).toDouble ( &ok ) };
4539
4534
if ( ok )
4540
4535
{
4541
- const double vYb { values.at ( 2 ).toDouble ( &ok ) };
4542
- if ( ok )
4543
- {
4544
- pointPatternFillSl->setDistanceY ( ( vYt + vYb ) + markerSize );
4545
- }
4536
+ pointPatternFillSl->setDistanceY ( ( vYt + vYb ) + markerSize );
4546
4537
}
4547
- const double vXr { values.at ( 1 ).toDouble ( &ok ) };
4538
+ }
4539
+ const double vXr { values.at ( 1 ).toDouble ( &ok ) };
4540
+ if ( ok )
4541
+ {
4542
+ const double vXl { values.at ( 3 ).toDouble ( &ok ) };
4548
4543
if ( ok )
4549
4544
{
4550
- const double vXl { values.at ( 3 ).toDouble ( &ok ) };
4551
- if ( ok )
4552
- {
4553
- pointPatternFillSl->setDistanceX ( ( vXr + vXl ) + markerSize );
4554
- }
4545
+ pointPatternFillSl->setDistanceX ( ( vXr + vXl ) + markerSize );
4555
4546
}
4556
- break ;
4557
4547
}
4558
- default :
4559
- break ;
4548
+ break ;
4560
4549
}
4550
+ default :
4551
+ break ;
4552
+ }
4553
+ };
4554
+
4555
+ // Set distance X and Y from vendor options
4556
+ QgsStringMap vendorOptions = QgsSymbolLayerUtils::getVendorOptionList ( element );
4557
+ for ( QgsStringMap::iterator it = vendorOptions.begin (); it != vendorOptions.end (); ++it )
4558
+ {
4559
+ // Legacy
4560
+ if ( it.key () == QLatin1String ( " distance" ) )
4561
+ {
4562
+ distanceParser ( it.value ().split ( ' ,' ) );
4563
+ }
4564
+ // GeoServer
4565
+ else if ( it.key () == QLatin1String ( " graphic-margin" ) )
4566
+ {
4567
+ distanceParser ( it.value ().split ( ' ' ) );
4568
+
4561
4569
}
4562
4570
}
4563
4571
return pointPatternFillSl.release ();
0 commit comments