39 auto simpleLine = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, size );
40 simpleLine->setWidthUnit( sizeUnit );
41 simpleLine->setPenCapStyle( Qt::RoundCap );
42 simpleLine->setPenJoinStyle( Qt::RoundJoin );
44 QVector< qreal > dashPattern;
45 double patternOffset = 0;
56 simpleLine->setPenStyle( Qt::NoPen );
65 dashPattern << 1 << 2.2;
69 dashPattern << 2 << 2;
73 dashPattern << 4 << 2;
77 dashPattern << 8 << 2;
81 dashPattern << 16 << 4;
85 dashPattern << 32 << 8;
89 dashPattern << 10.5 << 4.5;
93 dashPattern << 1 << 13.5 / 2;
97 dashPattern << 4 << 8;
101 dashPattern << 8 << 8;
105 dashPattern << 16 << 16;
109 dashPattern << 10 << 5 << 1 << 5;
113 dashPattern << 18 << 3 << 1 << 3;
117 dashPattern << 20 << 3 << 4 << 3;
121 dashPattern << 32 << 12 << 6 << 12;
125 dashPattern << 32 << 6 << 4 << 6 << 4 << 6;
129 dashPattern << 32 << 6 << 4 << 6 << 4 << 6 << 4 << 6;
133 dashPattern << 11 << 5 << 1 << 5 << 1 << 5;
137 dashPattern << 20 << 4 << 1 << 4 << 1 << 4;
141 dashPattern << 20 << 4 << 1 << 4 << 1 << 4 << 1 << 4;
145 dashPattern << 6 << 2 << 1 << 2;
149 dashPattern << 6 << 2 << 1 << 2 << 1 << 2;
153 dashPattern << 10.5 << 2 << 1 << 2 << 4 << 2 << 1 << 2;
160 dashPattern << 18 << 4;
164 dashPattern << 7 << 4;
168 dashPattern << 16 << 6;
181 dashPattern << 20 << 15;
193 dashPattern << 4 << 8;
204 dashPattern << 15 << 4;
222 dashPattern << 10 << 5;
230 dashPattern << 12 << 20;
234 dashPattern << 20 << 8;
252 dashPattern << 0 << 4 << 1 << 4;
283 context.
pushWarning( QObject::tr(
"The line style is not supported in QGIS" ) );
289 simpleLine->setWidth( simpleLine->width() * 2 );
297 QgsDebugError( QStringLiteral(
"Unknown line symbol identifier %1" ).arg( identifier ) );
301 if ( !dashPattern.isEmpty() )
304 for (
int i = 0; i < dashPattern.size() ; ++i )
305 dashPattern[ i ] *= size;
307 simpleLine->setCustomDashVector( dashPattern );
308 simpleLine->setUseCustomDashPattern(
true );
309 simpleLine->setCustomDashPatternUnit( sizeUnit );
311 simpleLine->setDashPatternOffset( patternOffset * size );
312 simpleLine->setDashPatternOffsetUnit( sizeUnit );
315 auto symbol = std::make_unique< QgsLineSymbol >(
QgsSymbolLayerList() << simpleLine.release() );
317 if ( ( identifier >= 26 && identifier < 29 ) || ( identifier >= 31 && identifier < 34 ) || ( identifier >= 36 && identifier < 38 ) || ( identifier >= 47 && identifier <= 53 ) || identifier == 118 )
319 auto hash = std::make_unique< QgsHashedLineSymbolLayer >();
323 double lineOffset = 0;
325 switch ( identifier )
424 hash->setInterval( spacing * size );
425 hash->setIntervalUnit( sizeUnit );
427 hash->setOffset( lineOffset * size );
428 hash->setOffsetUnit( sizeUnit );
430 hash->setOffsetAlongLine( offset * size );
431 hash->setOffsetAlongLineUnit( sizeUnit );
433 hash->setHashLength( length * size );
434 hash->setHashLengthUnit( sizeUnit );
436 auto subSimpleLine = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, size );
437 subSimpleLine->setWidthUnit( sizeUnit );
438 subSimpleLine->setPenCapStyle( Qt::RoundCap );
439 subSimpleLine->setPenJoinStyle( Qt::RoundJoin );
441 auto subSymbol = std::make_unique< QgsLineSymbol >(
QgsSymbolLayerList() << subSimpleLine.release() );
442 hash->setSubSymbol( subSymbol.release() );
444 if ( identifier == 31 || identifier == 33 )
446 std::unique_ptr< QgsHashedLineSymbolLayer > hash2( hash->clone() );
447 hash->setOffsetAlongLine( hash->offsetAlongLine() - size );
448 hash2->setOffsetAlongLine( hash2->offsetAlongLine() + size );
449 symbol->appendSymbolLayer( hash2.release() );
451 else if ( identifier == 36 || identifier == 37 )
453 std::unique_ptr< QgsHashedLineSymbolLayer > hash2( hash->clone() );
454 hash2->setOffsetAlongLine( dashPattern.at( 0 ) );
455 symbol->appendSymbolLayer( hash2.release() );
457 else if ( identifier == 52 || identifier == 53 )
459 std::unique_ptr< QgsHashedLineSymbolLayer > hash2( hash->clone() );
460 hash2->setOffsetAlongLine( hash->offsetAlongLine() * 2 );
461 symbol->appendSymbolLayer( hash2.release() );
463 else if ( identifier == 118 )
465 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setColor( QColor( 0, 0, 0 ) );
466 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setWidth( 0 );
467 symbol->symbolLayer( 0 )->setLocked(
true );
469 std::unique_ptr<QgsSimpleLineSymbolLayer > secondRail( qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->clone() );
470 const double offset = 2 * size;
471 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setOffset( offset );
472 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setOffsetUnit( sizeUnit );
473 secondRail->setOffset( -offset );
474 secondRail->setOffsetUnit( sizeUnit );
476 secondRail->setLocked(
true );
477 symbol->appendSymbolLayer( secondRail.release() );
479 symbol->appendSymbolLayer( hash.release() );
481 else if ( ( identifier >= 29 && identifier < 31 ) || ( identifier >= 34 && identifier < 36 ) )
485 switch ( identifier )
503 auto hash = std::make_unique< QgsHashedLineSymbolLayer >();
504 hash->setInterval( spacing * size * 2 );
505 hash->setIntervalUnit( sizeUnit );
507 hash->setOffsetAlongLine( offset * size );
508 hash->setOffsetAlongLineUnit( sizeUnit );
510 hash->setHashLength( 3.5 * size * 0.5 );
511 hash->setHashLengthUnit( sizeUnit );
513 auto subSimpleLine = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, size );
514 subSimpleLine->setWidthUnit( sizeUnit );
515 subSimpleLine->setPenCapStyle( Qt::RoundCap );
516 subSimpleLine->setPenJoinStyle( Qt::RoundJoin );
518 auto subSymbol = std::make_unique< QgsLineSymbol >(
QgsSymbolLayerList() << subSimpleLine.release() );
519 hash->setSubSymbol( subSymbol.release() );
520 std::unique_ptr< QgsHashedLineSymbolLayer > hash2( hash->clone() );
522 hash->setOffset( -hash->hashLength() );
523 hash->setOffsetUnit( hash->hashLengthUnit() );
524 hash2->setOffset( hash->hashLength() );
525 hash2->setOffsetUnit( hash->hashLengthUnit() );
526 hash2->setOffsetAlongLine( hash2->offsetAlongLine() + hash2->interval() * 0.5 );
528 switch ( identifier )
532 symbol->appendSymbolLayer( hash.release() );
533 symbol->appendSymbolLayer( hash2.release() );
539 std::unique_ptr< QgsHashedLineSymbolLayer > hash3( hash->clone() );
540 std::unique_ptr< QgsHashedLineSymbolLayer > hash4( hash2->clone() );
542 hash->setOffsetAlongLine( hash->offsetAlongLine() - size );
543 hash3->setOffsetAlongLine( hash3->offsetAlongLine() + size );
544 hash2->setOffsetAlongLine( hash2->offsetAlongLine() - size );
545 hash4->setOffsetAlongLine( hash4->offsetAlongLine() + size );
547 symbol->appendSymbolLayer( hash.release() );
548 symbol->appendSymbolLayer( hash2.release() );
549 symbol->appendSymbolLayer( hash3.release() );
550 symbol->appendSymbolLayer( hash4.release() );
555 else if ( ( identifier >= 38 && identifier < 41 ) || ( identifier >= 54 && identifier <= 61 ) || ( identifier >= 78 && identifier <= 109 ) || ( identifier >= 114 && identifier <= 117 ) )
557 auto marker = std::make_unique< QgsMarkerLineSymbolLayer >();
561 double markerSize = 1;
563 double lineOffset = 0;
566 switch ( identifier )
807 if ( identifier >= 78 && identifier <= 109 )
809 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setColor( QColor( 0, 0, 0 ) );
810 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setWidth( 0 );
811 symbol->symbolLayer( 0 )->setLocked(
true );
813 if ( ( identifier >= 84 && identifier <= 85 ) || ( identifier >= 92 && identifier <= 93 ) || ( identifier >= 100 && identifier <= 101 ) || ( identifier >= 108 && identifier <= 109 ) )
815 std::unique_ptr<QgsSimpleLineSymbolLayer > secondRail( qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->clone() );
817 double offset = 2 * size;
818 if ( identifier == 85 || identifier == 93 || identifier == 101 || identifier == 109 )
821 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setOffset( offset );
822 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setOffsetUnit( sizeUnit );
823 secondRail->setOffset( -offset );
824 secondRail->setOffsetUnit( sizeUnit );
826 secondRail->setLocked(
true );
827 symbol->appendSymbolLayer( secondRail.release() );
831 marker->setPlacements( placement );
832 marker->setInterval( spacing * size );
833 marker->setIntervalUnit( sizeUnit );
835 marker->setOffsetAlongLine( offset * size );
836 marker->setOffsetAlongLineUnit( sizeUnit );
838 marker->setOffset( lineOffset * size );
839 marker->setOffsetUnit( sizeUnit );
841 auto subSimpleMarker = std::make_unique< QgsSimpleMarkerSymbolLayer >( shape, markerSize * size );
842 subSimpleMarker->setColor( foreColor );
843 subSimpleMarker->setSizeUnit( sizeUnit );
844 subSimpleMarker->setStrokeWidth( size );
845 subSimpleMarker->setStrokeWidthUnit( sizeUnit );
846 subSimpleMarker->setAngle( angle );
848 subSimpleMarker->setPenJoinStyle( Qt::RoundJoin );
849 subSimpleMarker->setPenCapStyle( Qt::RoundCap );
857 subSimpleMarker->setStrokeStyle( Qt::NoPen );
860 auto subSymbol = std::make_unique< QgsMarkerSymbol >(
QgsSymbolLayerList() << subSimpleMarker.release() );
861 marker->setSubSymbol( subSymbol.release() );
863 if ( identifier == 56 )
865 std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
866 marker2->setOffsetAlongLine( 19 * size );
867 qgis::down_cast< QgsMarkerSymbol * >( marker2->subSymbol() )->setAngle( 0 );
868 symbol->appendSymbolLayer( marker2.release() );
870 else if ( identifier == 61 )
872 std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
874 qgis::down_cast< QgsMarkerSymbol * >( marker2->subSymbol() )->setAngle( 180 );
875 symbol->appendSymbolLayer( marker2.release() );
877 else if ( identifier == 80 || identifier == 88 || identifier == 96 || identifier == 104 )
879 std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
881 qgis::down_cast< QgsMarkerSymbol * >( marker2->subSymbol() )->setAngle( 180 );
882 symbol->appendSymbolLayer( marker2.release() );
885 if ( identifier == 116 )
887 std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
890 marker2->setOffsetAlongLine( 16 * size );
891 marker2->setOffset( -1.5 * size );
892 symbol->appendSymbolLayer( marker2.release() );
895 symbol->appendSymbolLayer( marker.release() );
897 else if ( identifier >= 41 && identifier < 45 )
899 const int count = identifier - 40;
901 simpleLine->
setCustomDashVector( QVector< qreal >() << 0 << 5.25 * size << 4 * size << ( 3.25 * size + ( count - 1 ) * ( 7.25 * size ) ) );
905 for (
int i = 1 ; i < count; ++i )
907 std::unique_ptr< QgsSimpleLineSymbolLayer > dashLine( simpleLine->
clone() );
909 dashLine->setCustomDashVector( QVector< qreal >() << 0 << 5.25 * size + ( i * 7.25 * size ) << 4 * size << ( 3.25 * size + ( count - 1 - i ) * ( 7.25 * size ) ) );
910 symbol->appendSymbolLayer( dashLine.release() );
913 auto simpleLine2 = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, 1.6 * size );
914 simpleLine2->setWidthUnit( sizeUnit );
915 simpleLine2->setPenCapStyle( Qt::RoundCap );
916 simpleLine2->setPenJoinStyle( Qt::RoundJoin );
918 simpleLine2->setCustomDashVector( QVector< qreal >() << 2 * size << 10.5 * size + ( count - 1 ) * ( 7.25 * size ) );
919 simpleLine2->setUseCustomDashPattern(
true );
920 simpleLine2->setCustomDashPatternUnit( sizeUnit );
922 symbol->appendSymbolLayer( simpleLine2.release() );
924 else if ( identifier == 45 )
926 auto simpleLine2 = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, 1.6 * size );
927 simpleLine2->setWidthUnit( sizeUnit );
928 simpleLine2->setPenCapStyle( Qt::RoundCap );
929 simpleLine2->setPenJoinStyle( Qt::RoundJoin );
931 simpleLine2->setCustomDashVector( QVector< qreal >() << 0 << 2 * size << 1.25 * size << 6.5 * size );
932 simpleLine2->setUseCustomDashPattern(
true );
933 simpleLine2->setCustomDashPatternUnit( sizeUnit );
935 symbol->appendSymbolLayer( simpleLine2.release() );
937 else if ( identifier == 46 )
939 auto hashLine = std::make_unique< QgsHashedLineSymbolLayer >();
941 hashLine->setInterval( 4 * size );
942 hashLine->setIntervalUnit( sizeUnit );
943 hashLine->setOffsetAlongLine( 2 * size );
944 hashLine->setOffsetAlongLineUnit( sizeUnit );
945 hashLine->setHashLength( 3.8 * size );
946 hashLine->setHashLengthUnit( sizeUnit );
948 hashLine->setSubSymbol( symbol.release() );
950 symbol = std::make_unique< QgsLineSymbol >(
QgsSymbolLayerList() << hashLine.release() );
952 else if ( identifier == 62 )
954 auto markerLine = std::make_unique< QgsMarkerLineSymbolLayer >();
956 markerLine->setOffsetAlongLine( 2 * size );
957 markerLine->setOffsetAlongLineUnit( sizeUnit );
960 subSimpleMarker->setColor( foreColor );
961 subSimpleMarker->setSizeUnit( sizeUnit );
962 subSimpleMarker->setStrokeWidth( 1.25 * size );
963 subSimpleMarker->setStrokeWidthUnit( sizeUnit );
964 subSimpleMarker->setAngle( 90 );
966 subSimpleMarker->setPenJoinStyle( Qt::RoundJoin );
967 subSimpleMarker->setPenCapStyle( Qt::RoundCap );
969 auto subSymbol = std::make_unique< QgsMarkerSymbol >(
QgsSymbolLayerList() << subSimpleMarker.release() );
970 markerLine->setSubSymbol( subSymbol.release() );
972 symbol->appendSymbolLayer( markerLine.release() );
974 else if ( ( identifier >= 63 && identifier <= 69 ) || ( identifier >= 72 && identifier <= 77 ) )
976 std::unique_ptr< QgsSimpleLineSymbolLayer > upperLine( qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->clone() );
977 upperLine->setUseCustomDashPattern(
false );
979 if ( identifier < 65 || ( identifier >= 68 && identifier <= 69 ) || identifier == 73 )
981 upperLine->setColor( QColor( 255, 255, 255 ) );
982 upperLine->setLocked(
true );
984 else if ( identifier < 67 || identifier == 72 || identifier == 75 || identifier == 76 )
986 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setColor( QColor( 0, 0, 0 ) );
987 symbol->symbolLayer( 0 )->setLocked(
true );
989 else if ( identifier <= 69 || identifier == 77 )
991 upperLine->setColor( QColor( 0, 0, 0 ) );
992 upperLine->setLocked(
true );
994 upperLine->setWidth( upperLine->width() * 0.9 );
997 upperLine->setRenderingPass( 1 );
1000 if ( identifier >= 73 && identifier <= 75 )
1002 upperLine->setCustomDashVector( QVector< qreal >() << 0 << 10 * size << 12 * size << 2 * size );
1003 upperLine->setUseCustomDashPattern(
true );
1004 upperLine->setCustomDashPatternUnit( sizeUnit );
1006 else if ( identifier == 76 )
1008 upperLine->setCustomDashVector( QVector< qreal >() << 0 << 10 * size << 24 * size << 14 * size );
1009 upperLine->setUseCustomDashPattern(
true );
1010 upperLine->setCustomDashPatternUnit( sizeUnit );
1013 if ( identifier == 75 || identifier == 76 )
1015 auto middleLine = std::make_unique< QgsSimpleLineSymbolLayer >( QColor( 255, 255, 255 ), upperLine->width() );
1016 middleLine->setWidthUnit( sizeUnit );
1017 middleLine->setLocked(
true );
1018 middleLine->setPenCapStyle( Qt::RoundCap );
1019 middleLine->setPenJoinStyle( Qt::RoundJoin );
1023 middleLine->setRenderingPass( 1 );
1024 upperLine->setRenderingPass( 2 );
1026 symbol->appendSymbolLayer( middleLine.release() );
1029 symbol->appendSymbolLayer( upperLine.release() );
1031 if ( identifier == 64 || identifier == 66 )
1033 auto middleLine = std::make_unique< QgsSimpleLineSymbolLayer >( identifier == 64 ? foreColor : QColor( 0, 0, 0 ), 0 );
1034 if ( identifier == 66 )
1035 middleLine->setLocked(
true );
1039 middleLine->setRenderingPass( 2 );
1041 symbol->appendSymbolLayer( middleLine.release() );
1044 else if ( identifier == 69 )
1046 auto hashedLine = std::make_unique< QgsHashedLineSymbolLayer >();
1048 auto middleLine = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, 0 );
1049 hashedLine->setSubSymbol(
new QgsLineSymbol( { middleLine.release() } ) );
1050 hashedLine->setInterval( 18 * size );
1051 hashedLine->setIntervalUnit( sizeUnit );
1052 hashedLine->setOffsetAlongLine( 4 * size );
1053 hashedLine->setOffsetAlongLineUnit( sizeUnit );
1054 hashedLine->setHashLength( 8 * size );
1055 hashedLine->setHashLengthUnit( sizeUnit );
1059 hashedLine->setRenderingPass( 2 );
1061 symbol->appendSymbolLayer( hashedLine.release() );
1063 else if ( identifier == 77 )
1065 auto middleLine = std::make_unique< QgsSimpleLineSymbolLayer >( QColor( 255, 255, 255 ), qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 1 ) )->width() );
1066 middleLine->setWidthUnit( sizeUnit );
1067 middleLine->setLocked(
true );
1068 middleLine->setPenCapStyle( Qt::RoundCap );
1069 middleLine->setPenJoinStyle( Qt::RoundJoin );
1070 middleLine->setCustomDashVector( QVector< qreal >() << 0 << 10 * size << 12 * size << 2 * size );
1071 middleLine->setUseCustomDashPattern(
true );
1072 middleLine->setCustomDashPatternUnit( sizeUnit );
1075 middleLine->setRenderingPass( 2 );
1077 symbol->appendSymbolLayer( middleLine.release() );
1080 else if ( identifier >= 70 && identifier <= 71 )
1082 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setColor( QColor( 0, 0, 0 ) );
1083 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setLocked(
true );
1085 auto simpleLine2 = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, size );
1086 simpleLine2->setWidthUnit( sizeUnit );
1087 simpleLine2->setPenCapStyle( Qt::RoundCap );
1088 simpleLine2->setPenJoinStyle( Qt::RoundJoin );
1090 if ( identifier == 70 )
1091 simpleLine2->setCustomDashVector( QVector< qreal >() << 0 << 12 * size << 12 * size << 0 );
1092 else if ( identifier == 71 )
1093 simpleLine2->setCustomDashVector( QVector< qreal >() << 0 << 16 * size << 12 * size << 4 * size );
1095 simpleLine2->setUseCustomDashPattern(
true );
1096 simpleLine2->setCustomDashPatternUnit( sizeUnit );
1098 symbol->appendSymbolLayer( simpleLine2.release() );
1101 return symbol.release();