[QGIS-it-user] Modificare la legenda di un layer categorizzato

Buongiorno,

Ho realizzato questo script da console per modificare la legenda di un layer categorizzato.

Ha bisogno del campo di tematizzazione, di un altro campo da cui trarre la nuova legenda e opzionalmente un altro testo.

Funziona perfettamente ma solo una volta dopo la quale se rilanciato manda QGIS in crash.

Esiste una soluzione ?

Grazie

Modify_CAT_LABELS.py (1.11 KB)

Ciao Giulio,
prima di tutto la riga 23 (new_renderer = QgsCategorizedSymbolRenderer()) mi pare sia superflua. Comunque il problema non dipende da questo.

A mio avviso il problema è dovuto al fatto che quando, nel ciclo for, assegni la simbologia di una categoria alla variabile new_sym (new_sym = category.symbol()), l’ownership di tale oggetto non viene trasferito, mentre nella creazione di un nuovo oggetto QgsRendererCategory(category.value(), new_sym, str(new_label[i])+alt_value) l’ownership della simbologia deve essere trasferito alla categoria (come indicato nella documentazione della classe QgsRendererCategory [1]).

Questo tentativo di trasferire ad un oggetto l’ownership che non si possiede di un altro oggetto creare il crash quando si tenta di accedere nuovamente all’oggetto.

Per ovviare a tale problema bisogna creare un clone (“deep copy”) del simbolo in modo da possederne l’ownership affinché possa essere trasferito correttamente all’oggetto QgsRendererCategory.

Quindi penso che il problema possa essere risolto modificando il codice in uno dei seguenti due modi:


for i, category in enumerate(categories):
new_sym = category.symbol()
new_categories.append(QgsRendererCategory(category.value(), new_sym.clone(), str(new_label[i])+alt_value))


for i, category in enumerate(categories):
new_sym = category.symbol().clone()
new_categories.append(QgsRendererCategory(category.value(), new_sym, str(new_label[i])+alt_value))

A presto.

Andrea

···

Il 14/06/2022 13:23, Giulio Fattori ha scritto:

Buongiorno,

Ho realizzato questo script da console per modificare la legenda di un layer categorizzato.

Ciao Giulio,
sei riuscito a risolvere il problema apportando le modifiche suggerite?

A presto.

Andrea

···

Il 14/06/2022 17:31, Andrea Giudiceandrea ha scritto:

Ciao Giulio,
prima di tutto la riga 23 (new_renderer = QgsCategorizedSymbolRenderer()) mi pare sia superflua. Comunque il problema non dipende da questo.

A mio avviso il problema è dovuto al fatto che quando, nel ciclo for, assegni la simbologia di una categoria alla variabile new_sym (new_sym = category.symbol()), l’ownership di tale oggetto non viene trasferito, mentre nella creazione di un nuovo oggetto QgsRendererCategory(category.value(), new_sym, str(new_label[i])+alt_value) l’ownership della simbologia deve essere trasferito alla categoria (come indicato nella documentazione della classe QgsRendererCategory [1]).

Questo tentativo di trasferire ad un oggetto l’ownership che non si possiede di un altro oggetto creare il crash quando si tenta di accedere nuovamente all’oggetto.

Per ovviare a tale problema bisogna creare un clone (“deep copy”) del simbolo in modo da possederne l’ownership affinché possa essere trasferito correttamente all’oggetto QgsRendererCategory.

Quindi penso che il problema possa essere risolto modificando il codice in uno dei seguenti due modi:


for i, category in enumerate(categories):
new_sym = category.symbol()
new_categories.append(QgsRendererCategory(category.value(), new_sym.clone(), str(new_label[i])+alt_value))


for i, category in enumerate(categories):
new_sym = category.symbol().clone()
new_categories.append(QgsRendererCategory(category.value(), new_sym, str(new_label[i])+alt_value))

A presto.

Andrea

Il 14/06/2022 13:23, Giulio Fattori ha scritto:

Buongiorno,

Ho realizzato questo script da console per modificare la legenda di un layer categorizzato.

Il 19/06/2022 12:28, Andrea Giudiceandrea ha scritto:

Ciao Giulio,
sei riuscito a risolvere il problema apportando le modifiche suggerite?

A presto.

Andrea

Il 14/06/2022 17:31, Andrea Giudiceandrea ha scritto:

Ciao Giulio,
prima di tutto la riga 23 (new_renderer = QgsCategorizedSymbolRenderer()) mi pare sia superflua. Comunque il problema non dipende da questo.

A mio avviso il problema è dovuto al fatto che quando, nel ciclo for, assegni la simbologia di una categoria alla variabile new_sym (new_sym = category.symbol()), l'ownership di tale oggetto non viene trasferito, mentre nella creazione di un nuovo oggetto QgsRendererCategory(category.value(), new_sym, str(new_label[i])+alt_value) l'ownership della simbologia deve essere trasferito alla categoria (come indicato nella documentazione della classe QgsRendererCategory [1]).

Questo tentativo di trasferire ad un oggetto l'ownership che non si possiede di un altro oggetto creare il crash quando si tenta di accedere nuovamente all'oggetto.

Per ovviare a tale problema bisogna creare un clone ("deep copy") del simbolo in modo da possederne l'ownership affinché possa essere trasferito correttamente all'oggetto QgsRendererCategory.

Quindi penso che il problema possa essere risolto modificando il codice in uno dei seguenti due modi:

...
for i, category in enumerate(categories):
new_sym = category.symbol()
new_categories.append(QgsRendererCategory(category.value(), new_sym.clone(), str(new_label[i])+alt_value))
...

...
for i, category in enumerate(categories):
new_sym = category.symbol().clone()
new_categories.append(QgsRendererCategory(category.value(), new_sym, str(new_label[i])+alt_value))
...

A presto.

Andrea

Il 14/06/2022 13:23, Giulio Fattori ha scritto:

Buongiorno,

Ho realizzato questo script da console per modificare la legenda di un layer categorizzato.

Ciao Andrea,

mi scuso del ritardo nel risponderti ma ero in ferie e per qualche giorno niente pc.

La tua soluzione, come sempre, ha risolto efficacemente il problema e Toto ne ha fatto un post.

https://github.com/Korto19/Edit-Legend-Text-Categorized

L'algoritmo ha ancora qualche problema con layer filtrati ma per ora non ho avuto modo di capire come risolvere.

Grazie ancora e a presto

Giulio