45 auto simpleLine = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, size );
46 simpleLine->setWidthUnit( sizeUnit );
47 simpleLine->setPenCapStyle( Qt::RoundCap );
48 simpleLine->setPenJoinStyle( Qt::RoundJoin );
50 QVector< qreal > dashPattern;
51 double patternOffset = 0;
62 simpleLine->setPenStyle( Qt::NoPen );
71 dashPattern << 1 << 2.2;
75 dashPattern << 2 << 2;
79 dashPattern << 4 << 2;
83 dashPattern << 8 << 2;
87 dashPattern << 16 << 4;
91 dashPattern << 32 << 8;
95 dashPattern << 10.5 << 4.5;
99 dashPattern << 1 << 13.5 / 2;
103 dashPattern << 4 << 8;
107 dashPattern << 8 << 8;
111 dashPattern << 16 << 16;
115 dashPattern << 10 << 5 << 1 << 5;
119 dashPattern << 18 << 3 << 1 << 3;
123 dashPattern << 20 << 3 << 4 << 3;
127 dashPattern << 32 << 12 << 6 << 12;
131 dashPattern << 32 << 6 << 4 << 6 << 4 << 6;
135 dashPattern << 32 << 6 << 4 << 6 << 4 << 6 << 4 << 6;
139 dashPattern << 11 << 5 << 1 << 5 << 1 << 5;
143 dashPattern << 20 << 4 << 1 << 4 << 1 << 4;
147 dashPattern << 20 << 4 << 1 << 4 << 1 << 4 << 1 << 4;
151 dashPattern << 6 << 2 << 1 << 2;
155 dashPattern << 6 << 2 << 1 << 2 << 1 << 2;
159 dashPattern << 10.5 << 2 << 1 << 2 << 4 << 2 << 1 << 2;
166 dashPattern << 18 << 4;
170 dashPattern << 7 << 4;
174 dashPattern << 16 << 6;
187 dashPattern << 20 << 15;
199 dashPattern << 4 << 8;
210 dashPattern << 15 << 4;
228 dashPattern << 10 << 5;
236 dashPattern << 12 << 20;
240 dashPattern << 20 << 8;
258 dashPattern << 0 << 4 << 1 << 4;
289 context.
pushWarning( QObject::tr(
"The line style is not supported in QGIS" ) );
295 simpleLine->setWidth( simpleLine->width() * 2 );
303 QgsDebugError( u
"Unknown line symbol identifier %1"_s.arg( identifier ) );
307 if ( !dashPattern.isEmpty() )
310 for (
int i = 0; i < dashPattern.size(); ++i )
311 dashPattern[i] *= size;
313 simpleLine->setCustomDashVector( dashPattern );
314 simpleLine->setUseCustomDashPattern(
true );
315 simpleLine->setCustomDashPatternUnit( sizeUnit );
317 simpleLine->setDashPatternOffset( patternOffset * size );
318 simpleLine->setDashPatternOffsetUnit( sizeUnit );
321 auto symbol = std::make_unique< QgsLineSymbol >(
QgsSymbolLayerList() << simpleLine.release() );
323 if ( ( identifier >= 26 && identifier < 29 ) || ( identifier >= 31 && identifier < 34 ) || ( identifier >= 36 && identifier < 38 ) || ( identifier >= 47 && identifier <= 53 ) || identifier == 118 )
325 auto hash = std::make_unique< QgsHashedLineSymbolLayer >();
329 double lineOffset = 0;
331 switch ( identifier )
430 hash->setInterval( spacing * size );
431 hash->setIntervalUnit( sizeUnit );
433 hash->setOffset( lineOffset * size );
434 hash->setOffsetUnit( sizeUnit );
436 hash->setOffsetAlongLine( offset * size );
437 hash->setOffsetAlongLineUnit( sizeUnit );
439 hash->setHashLength( length * size );
440 hash->setHashLengthUnit( sizeUnit );
442 auto subSimpleLine = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, size );
443 subSimpleLine->setWidthUnit( sizeUnit );
444 subSimpleLine->setPenCapStyle( Qt::RoundCap );
445 subSimpleLine->setPenJoinStyle( Qt::RoundJoin );
447 auto subSymbol = std::make_unique< QgsLineSymbol >(
QgsSymbolLayerList() << subSimpleLine.release() );
448 hash->setSubSymbol( subSymbol.release() );
450 if ( identifier == 31 || identifier == 33 )
452 std::unique_ptr< QgsHashedLineSymbolLayer > hash2( hash->clone() );
453 hash->setOffsetAlongLine( hash->offsetAlongLine() - size );
454 hash2->setOffsetAlongLine( hash2->offsetAlongLine() + size );
455 symbol->appendSymbolLayer( hash2.release() );
457 else if ( identifier == 36 || identifier == 37 )
459 std::unique_ptr< QgsHashedLineSymbolLayer > hash2( hash->clone() );
460 hash2->setOffsetAlongLine( dashPattern.at( 0 ) );
461 symbol->appendSymbolLayer( hash2.release() );
463 else if ( identifier == 52 || identifier == 53 )
465 std::unique_ptr< QgsHashedLineSymbolLayer > hash2( hash->clone() );
466 hash2->setOffsetAlongLine( hash->offsetAlongLine() * 2 );
467 symbol->appendSymbolLayer( hash2.release() );
469 else if ( identifier == 118 )
471 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setColor( QColor( 0, 0, 0 ) );
472 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setWidth( 0 );
473 symbol->symbolLayer( 0 )->setLocked(
true );
475 std::unique_ptr<QgsSimpleLineSymbolLayer > secondRail( qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->clone() );
476 const double offset = 2 * size;
477 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setOffset( offset );
478 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setOffsetUnit( sizeUnit );
479 secondRail->setOffset( -offset );
480 secondRail->setOffsetUnit( sizeUnit );
482 secondRail->setLocked(
true );
483 symbol->appendSymbolLayer( secondRail.release() );
485 symbol->appendSymbolLayer( hash.release() );
487 else if ( ( identifier >= 29 && identifier < 31 ) || ( identifier >= 34 && identifier < 36 ) )
491 switch ( identifier )
509 auto hash = std::make_unique< QgsHashedLineSymbolLayer >();
510 hash->setInterval( spacing * size * 2 );
511 hash->setIntervalUnit( sizeUnit );
513 hash->setOffsetAlongLine( offset * size );
514 hash->setOffsetAlongLineUnit( sizeUnit );
516 hash->setHashLength( 3.5 * size * 0.5 );
517 hash->setHashLengthUnit( sizeUnit );
519 auto subSimpleLine = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, size );
520 subSimpleLine->setWidthUnit( sizeUnit );
521 subSimpleLine->setPenCapStyle( Qt::RoundCap );
522 subSimpleLine->setPenJoinStyle( Qt::RoundJoin );
524 auto subSymbol = std::make_unique< QgsLineSymbol >(
QgsSymbolLayerList() << subSimpleLine.release() );
525 hash->setSubSymbol( subSymbol.release() );
526 std::unique_ptr< QgsHashedLineSymbolLayer > hash2( hash->clone() );
528 hash->setOffset( -hash->hashLength() );
529 hash->setOffsetUnit( hash->hashLengthUnit() );
530 hash2->setOffset( hash->hashLength() );
531 hash2->setOffsetUnit( hash->hashLengthUnit() );
532 hash2->setOffsetAlongLine( hash2->offsetAlongLine() + hash2->interval() * 0.5 );
534 switch ( identifier )
538 symbol->appendSymbolLayer( hash.release() );
539 symbol->appendSymbolLayer( hash2.release() );
545 std::unique_ptr< QgsHashedLineSymbolLayer > hash3( hash->clone() );
546 std::unique_ptr< QgsHashedLineSymbolLayer > hash4( hash2->clone() );
548 hash->setOffsetAlongLine( hash->offsetAlongLine() - size );
549 hash3->setOffsetAlongLine( hash3->offsetAlongLine() + size );
550 hash2->setOffsetAlongLine( hash2->offsetAlongLine() - size );
551 hash4->setOffsetAlongLine( hash4->offsetAlongLine() + size );
553 symbol->appendSymbolLayer( hash.release() );
554 symbol->appendSymbolLayer( hash2.release() );
555 symbol->appendSymbolLayer( hash3.release() );
556 symbol->appendSymbolLayer( hash4.release() );
561 else if ( ( identifier >= 38 && identifier < 41 ) || ( identifier >= 54 && identifier <= 61 ) || ( identifier >= 78 && identifier <= 109 ) || ( identifier >= 114 && identifier <= 117 ) )
563 auto marker = std::make_unique< QgsMarkerLineSymbolLayer >();
567 double markerSize = 1;
569 double lineOffset = 0;
572 switch ( identifier )
813 if ( identifier >= 78 && identifier <= 109 )
815 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setColor( QColor( 0, 0, 0 ) );
816 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setWidth( 0 );
817 symbol->symbolLayer( 0 )->setLocked(
true );
819 if ( ( identifier >= 84 && identifier <= 85 ) || ( identifier >= 92 && identifier <= 93 ) || ( identifier >= 100 && identifier <= 101 ) || ( identifier >= 108 && identifier <= 109 ) )
821 std::unique_ptr<QgsSimpleLineSymbolLayer > secondRail( qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->clone() );
823 double offset = 2 * size;
824 if ( identifier == 85 || identifier == 93 || identifier == 101 || identifier == 109 )
827 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setOffset( offset );
828 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setOffsetUnit( sizeUnit );
829 secondRail->setOffset( -offset );
830 secondRail->setOffsetUnit( sizeUnit );
832 secondRail->setLocked(
true );
833 symbol->appendSymbolLayer( secondRail.release() );
837 marker->setPlacements( placement );
838 marker->setInterval( spacing * size );
839 marker->setIntervalUnit( sizeUnit );
841 marker->setOffsetAlongLine( offset * size );
842 marker->setOffsetAlongLineUnit( sizeUnit );
844 marker->setOffset( lineOffset * size );
845 marker->setOffsetUnit( sizeUnit );
847 auto subSimpleMarker = std::make_unique< QgsSimpleMarkerSymbolLayer >( shape, markerSize * size );
848 subSimpleMarker->setColor( foreColor );
849 subSimpleMarker->setSizeUnit( sizeUnit );
850 subSimpleMarker->setStrokeWidth( size );
851 subSimpleMarker->setStrokeWidthUnit( sizeUnit );
852 subSimpleMarker->setAngle( angle );
854 subSimpleMarker->setPenJoinStyle( Qt::RoundJoin );
855 subSimpleMarker->setPenCapStyle( Qt::RoundCap );
863 subSimpleMarker->setStrokeStyle( Qt::NoPen );
866 auto subSymbol = std::make_unique< QgsMarkerSymbol >(
QgsSymbolLayerList() << subSimpleMarker.release() );
867 marker->setSubSymbol( subSymbol.release() );
869 if ( identifier == 56 )
871 std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
872 marker2->setOffsetAlongLine( 19 * size );
873 qgis::down_cast< QgsMarkerSymbol * >( marker2->subSymbol() )->setAngle( 0 );
874 symbol->appendSymbolLayer( marker2.release() );
876 else if ( identifier == 61 )
878 std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
880 qgis::down_cast< QgsMarkerSymbol * >( marker2->subSymbol() )->setAngle( 180 );
881 symbol->appendSymbolLayer( marker2.release() );
883 else if ( identifier == 80 || identifier == 88 || identifier == 96 || identifier == 104 )
885 std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
887 qgis::down_cast< QgsMarkerSymbol * >( marker2->subSymbol() )->setAngle( 180 );
888 symbol->appendSymbolLayer( marker2.release() );
891 if ( identifier == 116 )
893 std::unique_ptr< QgsMarkerLineSymbolLayer > marker2( marker->clone() );
896 marker2->setOffsetAlongLine( 16 * size );
897 marker2->setOffset( -1.5 * size );
898 symbol->appendSymbolLayer( marker2.release() );
901 symbol->appendSymbolLayer( marker.release() );
903 else if ( identifier >= 41 && identifier < 45 )
905 const int count = identifier - 40;
907 simpleLine->
setCustomDashVector( QVector< qreal >() << 0 << 5.25 * size << 4 * size << ( 3.25 * size + ( count - 1 ) * ( 7.25 * size ) ) );
911 for (
int i = 1; i < count; ++i )
913 std::unique_ptr< QgsSimpleLineSymbolLayer > dashLine( simpleLine->
clone() );
915 dashLine->setCustomDashVector( QVector< qreal >() << 0 << 5.25 * size + ( i * 7.25 * size ) << 4 * size << ( 3.25 * size + ( count - 1 - i ) * ( 7.25 * size ) ) );
916 symbol->appendSymbolLayer( dashLine.release() );
919 auto simpleLine2 = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, 1.6 * size );
920 simpleLine2->setWidthUnit( sizeUnit );
921 simpleLine2->setPenCapStyle( Qt::RoundCap );
922 simpleLine2->setPenJoinStyle( Qt::RoundJoin );
924 simpleLine2->setCustomDashVector( QVector< qreal >() << 2 * size << 10.5 * size + ( count - 1 ) * ( 7.25 * size ) );
925 simpleLine2->setUseCustomDashPattern(
true );
926 simpleLine2->setCustomDashPatternUnit( sizeUnit );
928 symbol->appendSymbolLayer( simpleLine2.release() );
930 else if ( identifier == 45 )
932 auto simpleLine2 = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, 1.6 * size );
933 simpleLine2->setWidthUnit( sizeUnit );
934 simpleLine2->setPenCapStyle( Qt::RoundCap );
935 simpleLine2->setPenJoinStyle( Qt::RoundJoin );
937 simpleLine2->setCustomDashVector( QVector< qreal >() << 0 << 2 * size << 1.25 * size << 6.5 * size );
938 simpleLine2->setUseCustomDashPattern(
true );
939 simpleLine2->setCustomDashPatternUnit( sizeUnit );
941 symbol->appendSymbolLayer( simpleLine2.release() );
943 else if ( identifier == 46 )
945 auto hashLine = std::make_unique< QgsHashedLineSymbolLayer >();
947 hashLine->setInterval( 4 * size );
948 hashLine->setIntervalUnit( sizeUnit );
949 hashLine->setOffsetAlongLine( 2 * size );
950 hashLine->setOffsetAlongLineUnit( sizeUnit );
951 hashLine->setHashLength( 3.8 * size );
952 hashLine->setHashLengthUnit( sizeUnit );
954 hashLine->setSubSymbol( symbol.release() );
956 symbol = std::make_unique< QgsLineSymbol >(
QgsSymbolLayerList() << hashLine.release() );
958 else if ( identifier == 62 )
960 auto markerLine = std::make_unique< QgsMarkerLineSymbolLayer >();
962 markerLine->setOffsetAlongLine( 2 * size );
963 markerLine->setOffsetAlongLineUnit( sizeUnit );
966 subSimpleMarker->setColor( foreColor );
967 subSimpleMarker->setSizeUnit( sizeUnit );
968 subSimpleMarker->setStrokeWidth( 1.25 * size );
969 subSimpleMarker->setStrokeWidthUnit( sizeUnit );
970 subSimpleMarker->setAngle( 90 );
972 subSimpleMarker->setPenJoinStyle( Qt::RoundJoin );
973 subSimpleMarker->setPenCapStyle( Qt::RoundCap );
975 auto subSymbol = std::make_unique< QgsMarkerSymbol >(
QgsSymbolLayerList() << subSimpleMarker.release() );
976 markerLine->setSubSymbol( subSymbol.release() );
978 symbol->appendSymbolLayer( markerLine.release() );
980 else if ( ( identifier >= 63 && identifier <= 69 ) || ( identifier >= 72 && identifier <= 77 ) )
982 std::unique_ptr< QgsSimpleLineSymbolLayer > upperLine( qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->clone() );
983 upperLine->setUseCustomDashPattern(
false );
985 if ( identifier < 65 || ( identifier >= 68 && identifier <= 69 ) || identifier == 73 )
987 upperLine->setColor( QColor( 255, 255, 255 ) );
988 upperLine->setLocked(
true );
990 else if ( identifier < 67 || identifier == 72 || identifier == 75 || identifier == 76 )
992 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setColor( QColor( 0, 0, 0 ) );
993 symbol->symbolLayer( 0 )->setLocked(
true );
995 else if ( identifier <= 69 || identifier == 77 )
997 upperLine->setColor( QColor( 0, 0, 0 ) );
998 upperLine->setLocked(
true );
1000 upperLine->setWidth( upperLine->width() * 0.9 );
1003 upperLine->setRenderingPass( 1 );
1006 if ( identifier >= 73 && identifier <= 75 )
1008 upperLine->setCustomDashVector( QVector< qreal >() << 0 << 10 * size << 12 * size << 2 * size );
1009 upperLine->setUseCustomDashPattern(
true );
1010 upperLine->setCustomDashPatternUnit( sizeUnit );
1012 else if ( identifier == 76 )
1014 upperLine->setCustomDashVector( QVector< qreal >() << 0 << 10 * size << 24 * size << 14 * size );
1015 upperLine->setUseCustomDashPattern(
true );
1016 upperLine->setCustomDashPatternUnit( sizeUnit );
1019 if ( identifier == 75 || identifier == 76 )
1021 auto middleLine = std::make_unique< QgsSimpleLineSymbolLayer >( QColor( 255, 255, 255 ), upperLine->width() );
1022 middleLine->setWidthUnit( sizeUnit );
1023 middleLine->setLocked(
true );
1024 middleLine->setPenCapStyle( Qt::RoundCap );
1025 middleLine->setPenJoinStyle( Qt::RoundJoin );
1029 middleLine->setRenderingPass( 1 );
1030 upperLine->setRenderingPass( 2 );
1032 symbol->appendSymbolLayer( middleLine.release() );
1035 symbol->appendSymbolLayer( upperLine.release() );
1037 if ( identifier == 64 || identifier == 66 )
1039 auto middleLine = std::make_unique< QgsSimpleLineSymbolLayer >( identifier == 64 ? foreColor : QColor( 0, 0, 0 ), 0 );
1040 if ( identifier == 66 )
1041 middleLine->setLocked(
true );
1045 middleLine->setRenderingPass( 2 );
1047 symbol->appendSymbolLayer( middleLine.release() );
1050 else if ( identifier == 69 )
1052 auto hashedLine = std::make_unique< QgsHashedLineSymbolLayer >();
1054 auto middleLine = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, 0 );
1055 hashedLine->setSubSymbol(
new QgsLineSymbol( { middleLine.release() } ) );
1056 hashedLine->setInterval( 18 * size );
1057 hashedLine->setIntervalUnit( sizeUnit );
1058 hashedLine->setOffsetAlongLine( 4 * size );
1059 hashedLine->setOffsetAlongLineUnit( sizeUnit );
1060 hashedLine->setHashLength( 8 * size );
1061 hashedLine->setHashLengthUnit( sizeUnit );
1065 hashedLine->setRenderingPass( 2 );
1067 symbol->appendSymbolLayer( hashedLine.release() );
1069 else if ( identifier == 77 )
1071 auto middleLine = std::make_unique< QgsSimpleLineSymbolLayer >( QColor( 255, 255, 255 ), qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 1 ) )->width() );
1072 middleLine->setWidthUnit( sizeUnit );
1073 middleLine->setLocked(
true );
1074 middleLine->setPenCapStyle( Qt::RoundCap );
1075 middleLine->setPenJoinStyle( Qt::RoundJoin );
1076 middleLine->setCustomDashVector( QVector< qreal >() << 0 << 10 * size << 12 * size << 2 * size );
1077 middleLine->setUseCustomDashPattern(
true );
1078 middleLine->setCustomDashPatternUnit( sizeUnit );
1081 middleLine->setRenderingPass( 2 );
1083 symbol->appendSymbolLayer( middleLine.release() );
1086 else if ( identifier >= 70 && identifier <= 71 )
1088 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setColor( QColor( 0, 0, 0 ) );
1089 qgis::down_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) )->setLocked(
true );
1091 auto simpleLine2 = std::make_unique< QgsSimpleLineSymbolLayer >( foreColor, size );
1092 simpleLine2->setWidthUnit( sizeUnit );
1093 simpleLine2->setPenCapStyle( Qt::RoundCap );
1094 simpleLine2->setPenJoinStyle( Qt::RoundJoin );
1096 if ( identifier == 70 )
1097 simpleLine2->setCustomDashVector( QVector< qreal >() << 0 << 12 * size << 12 * size << 0 );
1098 else if ( identifier == 71 )
1099 simpleLine2->setCustomDashVector( QVector< qreal >() << 0 << 16 * size << 12 * size << 4 * size );
1101 simpleLine2->setUseCustomDashPattern(
true );
1102 simpleLine2->setCustomDashPatternUnit( sizeUnit );
1104 symbol->appendSymbolLayer( simpleLine2.release() );