43 auto simpleLine = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, size );
44 simpleLine->setWidthUnit( sizeUnit );
45 simpleLine->setPenCapStyle( Qt::RoundCap );
46 simpleLine->setPenJoinStyle( Qt::RoundJoin );
48 QVector< qreal > dashPattern;
49 double patternOffset = 0;
60 simpleLine->setPenStyle( Qt::NoPen );
69 dashPattern << 1 << 2.2;
73 dashPattern << 2 << 2;
77 dashPattern << 4 << 2;
81 dashPattern << 8 << 2;
85 dashPattern << 16 << 4;
89 dashPattern << 32 << 8;
93 dashPattern << 10.5 << 4.5;
97 dashPattern << 1 << 13.5 / 2;
101 dashPattern << 4 << 8;
105 dashPattern << 8 << 8;
109 dashPattern << 16 << 16;
113 dashPattern << 10 << 5 << 1 << 5;
117 dashPattern << 18 << 3 << 1 << 3;
121 dashPattern << 20 << 3 << 4 << 3;
125 dashPattern << 32 << 12 << 6 << 12;
129 dashPattern << 32 << 6 << 4 << 6 << 4 << 6;
133 dashPattern << 32 << 6 << 4 << 6 << 4 << 6 << 4 << 6;
137 dashPattern << 11 << 5 << 1 << 5 << 1 << 5;
141 dashPattern << 20 << 4 << 1 << 4 << 1 << 4;
145 dashPattern << 20 << 4 << 1 << 4 << 1 << 4 << 1 << 4;
149 dashPattern << 6 << 2 << 1 << 2;
153 dashPattern << 6 << 2 << 1 << 2 << 1 << 2;
157 dashPattern << 10.5 << 2 << 1 << 2 << 4 << 2 << 1 << 2;
164 dashPattern << 18 << 4;
168 dashPattern << 7 << 4;
172 dashPattern << 16 << 6;
185 dashPattern << 20 << 15;
197 dashPattern << 4 << 8;
208 dashPattern << 15 << 4;
226 dashPattern << 10 << 5;
234 dashPattern << 12 << 20;
238 dashPattern << 20 << 8;
256 dashPattern << 0 << 4 << 1 << 4;
287 context.
pushWarning( QObject::tr(
"The line style is not supported in QGIS" ) );
293 simpleLine->setWidth( simpleLine->width() * 2 );
301 QgsDebugError( u
"Unknown line symbol identifier %1"_s.arg( identifier ) );
305 if ( !dashPattern.isEmpty() )
308 for (
int i = 0; i < dashPattern.size() ; ++i )
309 dashPattern[ i ] *= size;
311 simpleLine->setCustomDashVector( dashPattern );
312 simpleLine->setUseCustomDashPattern(
true );
313 simpleLine->setCustomDashPatternUnit( sizeUnit );
315 simpleLine->setDashPatternOffset( patternOffset * size );
316 simpleLine->setDashPatternOffsetUnit( sizeUnit );
319 auto symbol = std::make_unique< QgsLineSymbol >(
QgsSymbolLayerList() << simpleLine.release() );
321 if ( ( identifier >= 26 && identifier < 29 ) || ( identifier >= 31 && identifier < 34 ) || ( identifier >= 36 && identifier < 38 ) || ( identifier >= 47 && identifier <= 53 ) || identifier == 118 )
323 auto hash = std::make_unique< QgsHashedLineSymbolLayer >();
327 double lineOffset = 0;
329 switch ( identifier )
428 hash->setInterval( spacing * size );
429 hash->setIntervalUnit( sizeUnit );
431 hash->setOffset( lineOffset * size );
432 hash->setOffsetUnit( sizeUnit );
434 hash->setOffsetAlongLine( offset * size );
435 hash->setOffsetAlongLineUnit( sizeUnit );
437 hash->setHashLength( length * size );
438 hash->setHashLengthUnit( sizeUnit );
440 auto subSimpleLine = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, size );
441 subSimpleLine->setWidthUnit( sizeUnit );
442 subSimpleLine->setPenCapStyle( Qt::RoundCap );
443 subSimpleLine->setPenJoinStyle( Qt::RoundJoin );
445 auto subSymbol = std::make_unique< QgsLineSymbol >(
QgsSymbolLayerList() << subSimpleLine.release() );
446 hash->setSubSymbol( subSymbol.release() );
448 if ( identifier == 31 || identifier == 33 )
450 std::unique_ptr< QgsHashedLineSymbolLayer > hash2( hash->clone() );
451 hash->setOffsetAlongLine( hash->offsetAlongLine() - size );
452 hash2->setOffsetAlongLine( hash2->offsetAlongLine() + size );
453 symbol->appendSymbolLayer( hash2.release() );
455 else if ( identifier == 36 || identifier == 37 )
457 std::unique_ptr< QgsHashedLineSymbolLayer > hash2( hash->clone() );
458 hash2->setOffsetAlongLine( dashPattern.at( 0 ) );
459 symbol->appendSymbolLayer( hash2.release() );
461 else if ( identifier == 52 || identifier == 53 )
463 std::unique_ptr< QgsHashedLineSymbolLayer > hash2( hash->clone() );
464 hash2->setOffsetAlongLine( hash->offsetAlongLine() * 2 );
465 symbol->appendSymbolLayer( hash2.release() );
467 else if ( identifier == 118 )
469 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setColor( QColor( 0, 0, 0 ) );
470 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setWidth( 0 );
471 symbol->symbolLayer( 0 )->setLocked(
true );
473 std::unique_ptr<QgsSimpleLineSymbolLayer > secondRail( qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->clone() );
474 const double offset = 2 * size;
475 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setOffset( offset );
476 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setOffsetUnit( sizeUnit );
477 secondRail->setOffset( -offset );
478 secondRail->setOffsetUnit( sizeUnit );
480 secondRail->setLocked(
true );
481 symbol->appendSymbolLayer( secondRail.release() );
483 symbol->appendSymbolLayer( hash.release() );
485 else if ( ( identifier >= 29 && identifier < 31 ) || ( identifier >= 34 && identifier < 36 ) )
489 switch ( identifier )
507 auto hash = std::make_unique< QgsHashedLineSymbolLayer >();
508 hash->setInterval( spacing * size * 2 );
509 hash->setIntervalUnit( sizeUnit );
511 hash->setOffsetAlongLine( offset * size );
512 hash->setOffsetAlongLineUnit( sizeUnit );
514 hash->setHashLength( 3.5 * size * 0.5 );
515 hash->setHashLengthUnit( sizeUnit );
517 auto subSimpleLine = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, size );
518 subSimpleLine->setWidthUnit( sizeUnit );
519 subSimpleLine->setPenCapStyle( Qt::RoundCap );
520 subSimpleLine->setPenJoinStyle( Qt::RoundJoin );
522 auto subSymbol = std::make_unique< QgsLineSymbol >(
QgsSymbolLayerList() << subSimpleLine.release() );
523 hash->setSubSymbol( subSymbol.release() );
524 std::unique_ptr< QgsHashedLineSymbolLayer > hash2( hash->clone() );
526 hash->setOffset( -hash->hashLength() );
527 hash->setOffsetUnit( hash->hashLengthUnit() );
528 hash2->setOffset( hash->hashLength() );
529 hash2->setOffsetUnit( hash->hashLengthUnit() );
530 hash2->setOffsetAlongLine( hash2->offsetAlongLine() + hash2->interval() * 0.5 );
532 switch ( identifier )
536 symbol->appendSymbolLayer( hash.release() );
537 symbol->appendSymbolLayer( hash2.release() );
543 std::unique_ptr< QgsHashedLineSymbolLayer > hash3( hash->clone() );
544 std::unique_ptr< QgsHashedLineSymbolLayer > hash4( hash2->clone() );
546 hash->setOffsetAlongLine( hash->offsetAlongLine() - size );
547 hash3->setOffsetAlongLine( hash3->offsetAlongLine() + size );
548 hash2->setOffsetAlongLine( hash2->offsetAlongLine() - size );
549 hash4->setOffsetAlongLine( hash4->offsetAlongLine() + size );
551 symbol->appendSymbolLayer( hash.release() );
552 symbol->appendSymbolLayer( hash2.release() );
553 symbol->appendSymbolLayer( hash3.release() );
554 symbol->appendSymbolLayer( hash4.release() );
559 else if ( ( identifier >= 38 && identifier < 41 ) || ( identifier >= 54 && identifier <= 61 ) || ( identifier >= 78 && identifier <= 109 ) || ( identifier >= 114 && identifier <= 117 ) )
561 auto marker = std::make_unique< QgsMarkerLineSymbolLayer >();
565 double markerSize = 1;
567 double lineOffset = 0;
570 switch ( identifier )
811 if ( identifier >= 78 && identifier <= 109 )
813 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setColor( QColor( 0, 0, 0 ) );
814 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setWidth( 0 );
815 symbol->symbolLayer( 0 )->setLocked(
true );
817 if ( ( identifier >= 84 && identifier <= 85 ) || ( identifier >= 92 && identifier <= 93 ) || ( identifier >= 100 && identifier <= 101 ) || ( identifier >= 108 && identifier <= 109 ) )
819 std::unique_ptr<QgsSimpleLineSymbolLayer > secondRail( qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->clone() );
821 double offset = 2 * size;
822 if ( identifier == 85 || identifier == 93 || identifier == 101 || identifier == 109 )
825 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setOffset( offset );
826 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setOffsetUnit( sizeUnit );
827 secondRail->setOffset( -offset );
828 secondRail->setOffsetUnit( sizeUnit );
830 secondRail->setLocked(
true );
831 symbol->appendSymbolLayer( secondRail.release() );
835 marker->setPlacements( placement );
836 marker->setInterval( spacing * size );
837 marker->setIntervalUnit( sizeUnit );
839 marker->setOffsetAlongLine( offset * size );
840 marker->setOffsetAlongLineUnit( sizeUnit );
842 marker->setOffset( lineOffset * size );
843 marker->setOffsetUnit( sizeUnit );
845 auto subSimpleMarker = std::make_unique< QgsSimpleMarkerSymbolLayer >( shape, markerSize * size );
846 subSimpleMarker->setColor( foreColor );
847 subSimpleMarker->setSizeUnit( sizeUnit );
848 subSimpleMarker->setStrokeWidth( size );
849 subSimpleMarker->setStrokeWidthUnit( sizeUnit );
850 subSimpleMarker->setAngle( angle );
852 subSimpleMarker->setPenJoinStyle( Qt::RoundJoin );
853 subSimpleMarker->setPenCapStyle( Qt::RoundCap );
861 subSimpleMarker->setStrokeStyle( Qt::NoPen );
864 auto subSymbol = std::make_unique< QgsMarkerSymbol >(
QgsSymbolLayerList() << subSimpleMarker.release() );
865 marker->setSubSymbol( subSymbol.release() );
867 if ( identifier == 56 )
869 std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
870 marker2->setOffsetAlongLine( 19 * size );
871 qgis::down_cast< QgsMarkerSymbol * >( marker2->subSymbol() )->setAngle( 0 );
872 symbol->appendSymbolLayer( marker2.release() );
874 else if ( identifier == 61 )
876 std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
878 qgis::down_cast< QgsMarkerSymbol * >( marker2->subSymbol() )->setAngle( 180 );
879 symbol->appendSymbolLayer( marker2.release() );
881 else if ( identifier == 80 || identifier == 88 || identifier == 96 || identifier == 104 )
883 std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
885 qgis::down_cast< QgsMarkerSymbol * >( marker2->subSymbol() )->setAngle( 180 );
886 symbol->appendSymbolLayer( marker2.release() );
889 if ( identifier == 116 )
891 std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
894 marker2->setOffsetAlongLine( 16 * size );
895 marker2->setOffset( -1.5 * size );
896 symbol->appendSymbolLayer( marker2.release() );
899 symbol->appendSymbolLayer( marker.release() );
901 else if ( identifier >= 41 && identifier < 45 )
903 const int count = identifier - 40;
905 simpleLine->
setCustomDashVector( QVector< qreal >() << 0 << 5.25 * size << 4 * size << ( 3.25 * size + ( count - 1 ) * ( 7.25 * size ) ) );
909 for (
int i = 1 ; i < count; ++i )
911 std::unique_ptr< QgsSimpleLineSymbolLayer > dashLine( simpleLine->
clone() );
913 dashLine->setCustomDashVector( QVector< qreal >() << 0 << 5.25 * size + ( i * 7.25 * size ) << 4 * size << ( 3.25 * size + ( count - 1 - i ) * ( 7.25 * size ) ) );
914 symbol->appendSymbolLayer( dashLine.release() );
917 auto simpleLine2 = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, 1.6 * size );
918 simpleLine2->setWidthUnit( sizeUnit );
919 simpleLine2->setPenCapStyle( Qt::RoundCap );
920 simpleLine2->setPenJoinStyle( Qt::RoundJoin );
922 simpleLine2->setCustomDashVector( QVector< qreal >() << 2 * size << 10.5 * size + ( count - 1 ) * ( 7.25 * size ) );
923 simpleLine2->setUseCustomDashPattern(
true );
924 simpleLine2->setCustomDashPatternUnit( sizeUnit );
926 symbol->appendSymbolLayer( simpleLine2.release() );
928 else if ( identifier == 45 )
930 auto simpleLine2 = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, 1.6 * size );
931 simpleLine2->setWidthUnit( sizeUnit );
932 simpleLine2->setPenCapStyle( Qt::RoundCap );
933 simpleLine2->setPenJoinStyle( Qt::RoundJoin );
935 simpleLine2->setCustomDashVector( QVector< qreal >() << 0 << 2 * size << 1.25 * size << 6.5 * size );
936 simpleLine2->setUseCustomDashPattern(
true );
937 simpleLine2->setCustomDashPatternUnit( sizeUnit );
939 symbol->appendSymbolLayer( simpleLine2.release() );
941 else if ( identifier == 46 )
943 auto hashLine = std::make_unique< QgsHashedLineSymbolLayer >();
945 hashLine->setInterval( 4 * size );
946 hashLine->setIntervalUnit( sizeUnit );
947 hashLine->setOffsetAlongLine( 2 * size );
948 hashLine->setOffsetAlongLineUnit( sizeUnit );
949 hashLine->setHashLength( 3.8 * size );
950 hashLine->setHashLengthUnit( sizeUnit );
952 hashLine->setSubSymbol( symbol.release() );
954 symbol = std::make_unique< QgsLineSymbol >(
QgsSymbolLayerList() << hashLine.release() );
956 else if ( identifier == 62 )
958 auto markerLine = std::make_unique< QgsMarkerLineSymbolLayer >();
960 markerLine->setOffsetAlongLine( 2 * size );
961 markerLine->setOffsetAlongLineUnit( sizeUnit );
964 subSimpleMarker->setColor( foreColor );
965 subSimpleMarker->setSizeUnit( sizeUnit );
966 subSimpleMarker->setStrokeWidth( 1.25 * size );
967 subSimpleMarker->setStrokeWidthUnit( sizeUnit );
968 subSimpleMarker->setAngle( 90 );
970 subSimpleMarker->setPenJoinStyle( Qt::RoundJoin );
971 subSimpleMarker->setPenCapStyle( Qt::RoundCap );
973 auto subSymbol = std::make_unique< QgsMarkerSymbol >(
QgsSymbolLayerList() << subSimpleMarker.release() );
974 markerLine->setSubSymbol( subSymbol.release() );
976 symbol->appendSymbolLayer( markerLine.release() );
978 else if ( ( identifier >= 63 && identifier <= 69 ) || ( identifier >= 72 && identifier <= 77 ) )
980 std::unique_ptr< QgsSimpleLineSymbolLayer > upperLine( qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->clone() );
981 upperLine->setUseCustomDashPattern(
false );
983 if ( identifier < 65 || ( identifier >= 68 && identifier <= 69 ) || identifier == 73 )
985 upperLine->setColor( QColor( 255, 255, 255 ) );
986 upperLine->setLocked(
true );
988 else if ( identifier < 67 || identifier == 72 || identifier == 75 || identifier == 76 )
990 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setColor( QColor( 0, 0, 0 ) );
991 symbol->symbolLayer( 0 )->setLocked(
true );
993 else if ( identifier <= 69 || identifier == 77 )
995 upperLine->setColor( QColor( 0, 0, 0 ) );
996 upperLine->setLocked(
true );
998 upperLine->setWidth( upperLine->width() * 0.9 );
1001 upperLine->setRenderingPass( 1 );
1004 if ( identifier >= 73 && identifier <= 75 )
1006 upperLine->setCustomDashVector( QVector< qreal >() << 0 << 10 * size << 12 * size << 2 * size );
1007 upperLine->setUseCustomDashPattern(
true );
1008 upperLine->setCustomDashPatternUnit( sizeUnit );
1010 else if ( identifier == 76 )
1012 upperLine->setCustomDashVector( QVector< qreal >() << 0 << 10 * size << 24 * size << 14 * size );
1013 upperLine->setUseCustomDashPattern(
true );
1014 upperLine->setCustomDashPatternUnit( sizeUnit );
1017 if ( identifier == 75 || identifier == 76 )
1019 auto middleLine = std::make_unique< QgsSimpleLineSymbolLayer >( QColor( 255, 255, 255 ), upperLine->width() );
1020 middleLine->setWidthUnit( sizeUnit );
1021 middleLine->setLocked(
true );
1022 middleLine->setPenCapStyle( Qt::RoundCap );
1023 middleLine->setPenJoinStyle( Qt::RoundJoin );
1027 middleLine->setRenderingPass( 1 );
1028 upperLine->setRenderingPass( 2 );
1030 symbol->appendSymbolLayer( middleLine.release() );
1033 symbol->appendSymbolLayer( upperLine.release() );
1035 if ( identifier == 64 || identifier == 66 )
1037 auto middleLine = std::make_unique< QgsSimpleLineSymbolLayer >( identifier == 64 ? foreColor : QColor( 0, 0, 0 ), 0 );
1038 if ( identifier == 66 )
1039 middleLine->setLocked(
true );
1043 middleLine->setRenderingPass( 2 );
1045 symbol->appendSymbolLayer( middleLine.release() );
1048 else if ( identifier == 69 )
1050 auto hashedLine = std::make_unique< QgsHashedLineSymbolLayer >();
1052 auto middleLine = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, 0 );
1053 hashedLine->setSubSymbol(
new QgsLineSymbol( { middleLine.release() } ) );
1054 hashedLine->setInterval( 18 * size );
1055 hashedLine->setIntervalUnit( sizeUnit );
1056 hashedLine->setOffsetAlongLine( 4 * size );
1057 hashedLine->setOffsetAlongLineUnit( sizeUnit );
1058 hashedLine->setHashLength( 8 * size );
1059 hashedLine->setHashLengthUnit( sizeUnit );
1063 hashedLine->setRenderingPass( 2 );
1065 symbol->appendSymbolLayer( hashedLine.release() );
1067 else if ( identifier == 77 )
1069 auto middleLine = std::make_unique< QgsSimpleLineSymbolLayer >( QColor( 255, 255, 255 ), qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 1 ) )->width() );
1070 middleLine->setWidthUnit( sizeUnit );
1071 middleLine->setLocked(
true );
1072 middleLine->setPenCapStyle( Qt::RoundCap );
1073 middleLine->setPenJoinStyle( Qt::RoundJoin );
1074 middleLine->setCustomDashVector( QVector< qreal >() << 0 << 10 * size << 12 * size << 2 * size );
1075 middleLine->setUseCustomDashPattern(
true );
1076 middleLine->setCustomDashPatternUnit( sizeUnit );
1079 middleLine->setRenderingPass( 2 );
1081 symbol->appendSymbolLayer( middleLine.release() );
1084 else if ( identifier >= 70 && identifier <= 71 )
1086 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setColor( QColor( 0, 0, 0 ) );
1087 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setLocked(
true );
1089 auto simpleLine2 = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, size );
1090 simpleLine2->setWidthUnit( sizeUnit );
1091 simpleLine2->setPenCapStyle( Qt::RoundCap );
1092 simpleLine2->setPenJoinStyle( Qt::RoundJoin );
1094 if ( identifier == 70 )
1095 simpleLine2->setCustomDashVector( QVector< qreal >() << 0 << 12 * size << 12 * size << 0 );
1096 else if ( identifier == 71 )
1097 simpleLine2->setCustomDashVector( QVector< qreal >() << 0 << 16 * size << 12 * size << 4 * size );
1099 simpleLine2->setUseCustomDashPattern(
true );
1100 simpleLine2->setCustomDashPatternUnit( sizeUnit );
1102 symbol->appendSymbolLayer( simpleLine2.release() );
1105 return symbol.release();