18
18
from qgis .core import (QgsCategorizedSymbolRenderer ,
19
19
QgsRendererCategory ,
20
20
QgsMarkerSymbol ,
21
+ QgsLineSymbol ,
22
+ QgsFillSymbol ,
21
23
QgsField ,
22
24
QgsFields ,
23
25
QgsFeature ,
24
- QgsRenderContext
26
+ QgsRenderContext ,
27
+ QgsSymbol ,
28
+ QgsStyle
25
29
)
26
30
from qgis .PyQt .QtCore import QVariant
27
31
from qgis .PyQt .QtGui import QColor
@@ -38,6 +42,20 @@ def createMarkerSymbol():
38
42
return symbol
39
43
40
44
45
+ def createLineSymbol ():
46
+ symbol = QgsLineSymbol .createSimple ({
47
+ "color" : "100,150,50"
48
+ })
49
+ return symbol
50
+
51
+
52
+ def createFillSymbol ():
53
+ symbol = QgsFillSymbol .createSimple ({
54
+ "color" : "100,150,50"
55
+ })
56
+ return symbol
57
+
58
+
41
59
class TestQgsCategorizedSymbolRenderer (unittest .TestCase ):
42
60
43
61
def testFilter (self ):
@@ -312,6 +330,134 @@ def testLegendKeysWhileCounting(self):
312
330
313
331
renderer .stopRender (context )
314
332
333
+ def testMatchToSymbols (self ):
334
+ """
335
+ Test QgsCategorizedSymbolRender.matchToSymbols
336
+ """
337
+ renderer = QgsCategorizedSymbolRenderer ()
338
+ renderer .setClassAttribute ('x' )
339
+
340
+ symbol_a = createMarkerSymbol ()
341
+ symbol_a .setColor (QColor (255 , 0 , 0 ))
342
+ renderer .addCategory (QgsRendererCategory ('a' , symbol_a , 'a' ))
343
+ symbol_b = createMarkerSymbol ()
344
+ symbol_b .setColor (QColor (0 , 255 , 0 ))
345
+ renderer .addCategory (QgsRendererCategory ('b' , symbol_b , 'b' ))
346
+ symbol_c = createMarkerSymbol ()
347
+ symbol_c .setColor (QColor (0 , 0 , 255 ))
348
+ renderer .addCategory (QgsRendererCategory ('c ' , symbol_c , 'c' ))
349
+
350
+ matched , unmatched_cats , unmatched_symbols = renderer .matchToSymbols (None , QgsSymbol .Marker )
351
+ self .assertEqual (matched , 0 )
352
+
353
+ style = QgsStyle ()
354
+ symbol_a = createMarkerSymbol ()
355
+ symbol_a .setColor (QColor (255 , 10 , 10 ))
356
+ self .assertTrue (style .addSymbol ('a' , symbol_a ))
357
+ symbol_B = createMarkerSymbol ()
358
+ symbol_B .setColor (QColor (10 , 255 , 10 ))
359
+ self .assertTrue (style .addSymbol ('B ' , symbol_B ))
360
+ symbol_b = createFillSymbol ()
361
+ symbol_b .setColor (QColor (10 , 255 , 10 ))
362
+ self .assertTrue (style .addSymbol ('b' , symbol_b ))
363
+ symbol_C = createLineSymbol ()
364
+ symbol_C .setColor (QColor (10 , 255 , 10 ))
365
+ self .assertTrue (style .addSymbol ('C' , symbol_C ))
366
+ symbol_C = createMarkerSymbol ()
367
+ symbol_C .setColor (QColor (10 , 255 , 10 ))
368
+ self .assertTrue (style .addSymbol (' ----c/- ' , symbol_C ))
369
+
370
+ # non-matching symbol type
371
+ matched , unmatched_cats , unmatched_symbols = renderer .matchToSymbols (style , QgsSymbol .Line )
372
+ self .assertEqual (matched , 0 )
373
+ self .assertEqual (unmatched_cats , ['a' , 'b' , 'c ' ])
374
+ self .assertEqual (unmatched_symbols , [' ----c/- ' , 'B ' , 'C' , 'a' , 'b' ])
375
+
376
+ # exact match
377
+ matched , unmatched_cats , unmatched_symbols = renderer .matchToSymbols (style , QgsSymbol .Marker )
378
+ self .assertEqual (matched , 1 )
379
+ self .assertEqual (unmatched_cats , ['b' , 'c ' ])
380
+ self .assertEqual (unmatched_symbols , [' ----c/- ' , 'B ' , 'C' , 'b' ])
381
+
382
+ # make sure symbol was applied
383
+ context = QgsRenderContext ()
384
+ renderer .startRender (context , QgsFields ())
385
+ symbol , ok = renderer .symbolForValue2 ('a' )
386
+ self .assertTrue (ok )
387
+ self .assertEqual (symbol .color ().name (), '#ff0a0a' )
388
+ renderer .stopRender (context )
389
+
390
+ # case insensitive match
391
+ matched , unmatched_cats , unmatched_symbols = renderer .matchToSymbols (style , QgsSymbol .Marker , False )
392
+ self .assertEqual (matched , 2 )
393
+ self .assertEqual (unmatched_cats , ['c ' ])
394
+ self .assertEqual (unmatched_symbols , [' ----c/- ' , 'C' , 'b' ])
395
+
396
+ # make sure symbols were applied
397
+ context = QgsRenderContext ()
398
+ renderer .startRender (context , QgsFields ())
399
+ symbol , ok = renderer .symbolForValue2 ('a' )
400
+ self .assertTrue (ok )
401
+ self .assertEqual (symbol .color ().name (), '#ff0a0a' )
402
+ symbol , ok = renderer .symbolForValue2 ('b' )
403
+ self .assertTrue (ok )
404
+ self .assertEqual (symbol .color ().name (), '#0aff0a' )
405
+ renderer .stopRender (context )
406
+
407
+ # case insensitive match
408
+ matched , unmatched_cats , unmatched_symbols = renderer .matchToSymbols (style , QgsSymbol .Marker , False )
409
+ self .assertEqual (matched , 2 )
410
+ self .assertEqual (unmatched_cats , ['c ' ])
411
+ self .assertEqual (unmatched_symbols , [' ----c/- ' , 'C' , 'b' ])
412
+
413
+ # make sure symbols were applied
414
+ context = QgsRenderContext ()
415
+ renderer .startRender (context , QgsFields ())
416
+ symbol , ok = renderer .symbolForValue2 ('a' )
417
+ self .assertTrue (ok )
418
+ self .assertEqual (symbol .color ().name (), '#ff0a0a' )
419
+ symbol , ok = renderer .symbolForValue2 ('b' )
420
+ self .assertTrue (ok )
421
+ self .assertEqual (symbol .color ().name (), '#0aff0a' )
422
+ renderer .stopRender (context )
423
+
424
+ # tolerant match
425
+ matched , unmatched_cats , unmatched_symbols = renderer .matchToSymbols (style , QgsSymbol .Marker , True , True )
426
+ self .assertEqual (matched , 2 )
427
+ self .assertEqual (unmatched_cats , ['b' ])
428
+ self .assertEqual (unmatched_symbols , ['B ' , 'C' , 'b' ])
429
+
430
+ # make sure symbols were applied
431
+ context = QgsRenderContext ()
432
+ renderer .startRender (context , QgsFields ())
433
+ symbol , ok = renderer .symbolForValue2 ('a' )
434
+ self .assertTrue (ok )
435
+ self .assertEqual (symbol .color ().name (), '#ff0a0a' )
436
+ symbol , ok = renderer .symbolForValue2 ('c ' )
437
+ self .assertTrue (ok )
438
+ self .assertEqual (symbol .color ().name (), '#0aff0a' )
439
+ renderer .stopRender (context )
440
+
441
+ # tolerant match, case insensitive
442
+ matched , unmatched_cats , unmatched_symbols = renderer .matchToSymbols (style , QgsSymbol .Marker , False , True )
443
+ self .assertEqual (matched , 3 )
444
+ self .assertFalse (unmatched_cats )
445
+ self .assertEqual (unmatched_symbols , ['C' , 'b' ])
446
+
447
+ # make sure symbols were applied
448
+ context = QgsRenderContext ()
449
+ renderer .startRender (context , QgsFields ())
450
+ symbol , ok = renderer .symbolForValue2 ('a' )
451
+ self .assertTrue (ok )
452
+ self .assertEqual (symbol .color ().name (), '#ff0a0a' )
453
+ symbol , ok = renderer .symbolForValue2 ('b' )
454
+ self .assertTrue (ok )
455
+ self .assertEqual (symbol .color ().name (), '#0aff0a' )
456
+ symbol , ok = renderer .symbolForValue2 ('c ' )
457
+ self .assertTrue (ok )
458
+ self .assertEqual (symbol .color ().name (), '#0aff0a' )
459
+ renderer .stopRender (context )
460
+
315
461
316
462
if __name__ == "__main__" :
317
463
unittest .main ()
0 commit comments