Suite

Définition de la couleur de sélection transparente et de la couleur de bordure rouge à l'aide de PyQGIS

Définition de la couleur de sélection transparente et de la couleur de bordure rouge à l'aide de PyQGIS


J'ai une couche avec des informations différentes. Je veux changer la couleur du polygone sélectionné en "Transparent". Je suis capable d'y parvenir en utilisant:

iface.mapCanvas().setSelectionColor(QColor("Transparent"))

Mais je veux une couleur de bordure différente comme le rouge ou toute autre couleur. Pour un exemple dans ArcMap, il existe une option pour définir la couleur de la bordure, la largeur de la bordure et bien d'autres.

Comment puis-je y parvenir en utilisant le script Python dans QGIS ?


Il y a quelque temps, j'ai eu un problème similaire (Comment changer la symbologie des entités sélectionnées dans QGIS). Il semble que cette fonctionnalité ne soit pas encore disponible dans QGIS 2.12 (https://hub.qgis.org/issues/12879), vous pouvez donc obtenir cet effet en utilisantest sélectionnéfonction, disponible dans le plugin de Nathan qgsexpressionplus (https://github.com/NathanW2/qgsexpressionsplus).

Par exemple, pour modifier la couleur de la bordure des polygones sélectionnés, remplacez-la par la propriété définie par les données (QGIS 2.12) :

if( isselected( @layer_id ), color_rgb( 255, 0, 0), color_rgb(0, 0, 255) )

Lorsque variable@layer_idn'est pas disponible (par exemple QGIS 2.8.x) donnez le nom de la couche comme argument.

Cependant, je suis confronté au problème que le cas False pour les fonctionnalités non sélectionnées sera exécuté, mais pas le cas True lorsque les fonctionnalités sont sélectionnées. Comme solution de contournement, définissez la couleur de bordure par défaut sur la couleur des entités sélectionnées et la couleur de bordure des entités non sélectionnées en tant que propriété définie par les données.

Voir cet exemple, où color_rgb(255,0,0) n'a aucun effet (les étiquettes affichent l'état de sélection) :

Définissez des expressions similaires pour d'autres propriétés de symbole, par ex. largeur de la bordure.

AFAIK pour modifier les propriétés des symboles pour les objets sélectionnés en Python, il n'y a que des solutions de contournement. Il ne semble pas possible de changer la couleur de la bordure, car les paramètres intégrés de la fonction sélectionnée sont supérieurs .

1) Imitez en Python ce que fait le plugin qgsexpressionplus. Utilisez-le pour modifier la largeur de la bordure de 1 à 4 dans l'état sélectionné.

de qgis.utils importer qgsfunction de qgis.core importer QgsExpression, QgsMapLayerRegistry @qgsfunction(1, group="auto", register=False) def isselected(values, feature, parent): layername=values[0] fid = feature.id () couches = QgsMapLayerRegistry.instance().mapLayers() essayez : couche = couches[layername] sauf KeyError : essayez : layer = [l pour l dans couches.iteritems() si l[1].name() == layername ][0][1] sauf IndexError: parent.setEvalErrorString( u'Aucun calque avec identifiant ou nom {} trouvé'.format( layername ) ) return False return fid in layer.selectedFeaturesIds() QgsExpression.registerFunction(isselected) layer = iface.activeLayer() symb = layer.rendererV2().symbols()[0] symb.deleteSymbolLayer(0) slyr = QgsSimpleFillSymbolLayerV2.create({'width_border_expression': 'if( isselected( "+ layer.name() + '' ), 4, 1)'}) symb.appendSymbolLayer(slyr) iface.mapCanvas().refresh()

2) Utilisez les fonctionnalités QgsHighlight. Cela nécessite d'écrire une fonction (slot) et de la connecter au signal selectionChanged() de la couche. Lorsque des entités sont sélectionnées, une autre géométrie, la géométrie de surbrillance, est créée. Lorsque l'entité n'est plus sélectionnée, la géométrie de surbrillance est supprimée.

N'oubliez pas que vous ne modifiez pas la symbologie de sélection, mais que vous créez une autre géométrie qui se trouve au-dessus du symbole de sélection.

Voici la marche à suivre :

de qgis.gui import QgsHighlight de PyQt4.QtGui import QColor h_list = [] # fonction qui fait le travail de mise en évidence des fonctionnalités sélectionnées def Highlight_features (): global h_list # supprime tous les objets de surbrillance pour h dans la plage (len(h_list)): h_list .pop(h) # créer des géométries de surbrillance pour les objets sélectionnés pour i dans layer.selectedFeatures() : h = QgsHighlight(iface.mapCanvas(), i.geometry(), layer) # définir les propriétés du symbole de surbrillance h.setColor(QColor( 255,0,0,255)) h.setWidth(6) h.setFillColor(QColor(255,255,255,0)) # écris l'objet dans la liste h_list.append(h) # connecte la fonction au signal de la couche layer.selectionChanged.connect (highlight_features)

Nettoyez la connexion lorsque vous ne l'utilisez plus :

layer.selectionChanged.disconnect(highlight_features)

Effacer les éléments en surbrillance dans le canevas actuel :

J'ai essayé le code dans la réponse de @Detlev et j'ai travaillé après avoir modifié ceci :

pour h dans la plage (len(h_list)): h_list.pop(h)

avec ça :

pour h dans h_list : iface.mapCanvas().scene().deleteItem(h)

Voir la vidéo: QGIS Python PyQGIS - Get raster layer statistics